找好朋友之单调栈

给你一个数字类型的数组,让你找出数组每个元素的后面最近的一个比本元素大元素的位置,如果后面没有比本元素大的元素,则为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的范围内解决了。

posted @ 2022-04-07 18:58  小影影  阅读(46)  评论(0)    收藏  举报