前言:
今天来讲一下单调栈,它定义是非常简单的,首先栈是一种先进后出、后进先出的数据结构。而单调栈,就是说栈中的元素是严格单调递增或者递减的。它主要用来解决的问题:找到前一个或者后一个的最大或者最小元素。属于一种空间换时间的思想,通常用来把O(n^2)的时间复杂度降低到O(n)。
典型的做法:
假设我们是要找比当前元素大的元素,那么栈内的元素就是递增的(从栈顶往栈底方向)。
当元素大于栈顶的元素,就把栈顶的元素给替换成当前元素;
当元素小于等于栈顶元素,就直接入栈。
这样处理后,栈内就一直保持着一个从栈顶往栈底方向递增的单调栈。
注意:一般栈内储存的都是元素的下标而不是元素的值,因为下标可以直接找到值,而值不能直接找到下标。
所以如果是计算两个元素之间的距离的题目,储存值就没法算了。
因此单调栈里面说的单调性指的是下标对应的元素值单调的。
实例:
LeetCode:739-每日温度
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例 1:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
示例 2:
输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]
示例 3:
输入: temperatures = [30,60,90]
输出: [1,1,0]
提示:
1