전형적인 트리 구조의 재귀형 문제이다.
그리디하게 문제를 풀어낼 수 있지만, 해당 방법 이외의 방법으로 O(nlogn)의 속도를 내는 방법은 아래와 같이 재귀적으로 배열을 쪼개 들어가면서 가장 큰 값을 찾아 올려주는 것이다.
js는 꼬리재귀 최적화를 안해주므로 알아서 최적화를 해야한다.
/**
*
* @param {number[]} arr
* @param {number} start
* @param {number} end
*/
const max = (arr, start, end) => {
if (start === end) return arr[start];
else {
const mid = Math.floor((start + end) / 2);
const leftMax = max(arr, start, mid);
const rightMax = max(arr, mid + 1, end);
if (leftMax > rightMax) return leftMax;
else return rightMax;
}
};
const main = () => {
const arr = [1, 2, 3, 4, 2, 1, 9, 7, 9, 71, 9];
const start = 0;
const end = arr.length;
console.log(max(arr, start, end - 1));
};
main(); // 71