Day48 单调栈 Part01

38 阅读1分钟

基础

通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。

那么单调栈的原理是什么呢?为什么时间复杂度是O(n)就可以找到每一个元素的右边第一个比它大的元素位置呢?

单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。

更直白来说,就是用一个栈来记录我们遍历过的元素,因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(这里用单调栈)来记录我们遍历过的元素。

刷题

  1. 每日温度

leetcode.cn/problems/da…

image.png

利用栈,将没有找到更高气温的日期记录下来,后面只需要遍历栈即可,这就是单调栈

IMG_3409.HEIC

  1. 下一个更大元素I

leetcode.cn/problems/ne…

image.png

  1. 下一个更大的元素II

leetcode.cn/problems/ne…

image.png

可以通过取模,来代替两个for循环

for i:=0;i<len(nums)*2;i++ {
    i = i%len(nums)
}

image.png

总结

通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了