[代码随想录]Day50-单调栈part01

题目:739. 每日温度

思路:

要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了
维护一个 栈顶->栈底 由小到大的栈;这样在之后(右侧)遇到更大的数时,就可以得到所有在他前面并且比他小的数,就能获得结果。
初始化默认为0;

代码:

func dailyTemperatures(num []int) []int {
    res := make([]int, len(num))
    stack := []int{}
    for i, v := range num {
        for len(stack) != 0 && v > num[stack[len(stack)-1]] {
            top := stack[len(stack)-1]
            stack = stack[:len(stack)-1]
            res[top] = i - top
        }
        stack = append(stack, i)
    }
    return res
}

参考:

代码随想录

题目:496. 下一个更大元素 I

思路:

比上面一个题多了一步,如果只有nums2那么这道题和上面一样,多了一步是需要按照nums1的顺序把nums2的结果输出。

代码:

func nextGreaterElement(nums1 []int, nums2 []int) []int {
    res := make([]int, len(nums1))
    mp := make(map[int]int)
    for i := 0; i <len(nums1); i++ {
        res[i] = -1
        mp[nums1[i]] = i
    }
    stack := []int{}
    stack = append(stack, 0)
    for i := 1; i < len(nums2); i++ {
        for len(stack) > 0 && nums2[i] > nums2[stack[len(stack)-1]] {
            top := stack[len(stack)-1]
            if _, ok := mp[nums2[top]]; ok {
                index := mp[nums2[top]]
                res[index] = nums2[i]
            }
            stack = stack[:len(stack)-1]
        }
        stack = append(stack, i)
    }
    return res
}

参考:

代码随想录

posted @ 2023-09-21 10:19  WtcSky  阅读(16)  评论(0)    收藏  举报