找好朋友之单调栈
给你一个数字类型的数组,让你找出数组每个元素的后面最近的一个比本元素大元素的位置,如果后面没有比本元素大的元素,则为0。返回得到的新数组。
例如给你的数组为 [2, 1, 3, 4, 2],
则返回的数组为 [3, 3, 4, 0, 0],
我看到的解法为
function getGoodFriend(arr) { let ins = [] for(let i = 0; i < arr.length; i++) { for(let j = i; j < arr.length; j++) { if (arr[j] > arr[i]) { ins[i] = j + 1 } } if (!ins[i]) { ins[i] = 0 } } return ins }
这种解法虽然可以得到结果,但是时间复杂度太高,我们可以用单调栈解决
function getGoodFriend(arr) { let ins = [] let stack = [] let index = [] for(let i = arr.length - 1; i >= 0; i--) { while (stack.length && stack.at(-1) <= arr[i]) { stack.pop() index.pop() } if(stack.length) { ins[i] = index.at(-1) } else { ins[i] = 0 } stack.push(arr[i]) index.push(i + 1) } return ins }
如此,我们便可以在时间复杂度为N的范围内解决了。

浙公网安备 33010602011771号