原题说明
Given a list of daily temperatures
, produce a list that, for each day in the input, tells you how many days you would have to wait until a warmer temperature. If there is no future day for which this is possible, put 0 instead.
For example, given the list temperatures = [73, 74, 75, 71, 69, 72, 76, 73]
, your output should be [1, 1, 4, 2, 1, 1, 0, 0]
.
Note: The length of temperatures
will be in the range [1, 30000]
. Each temperature will be an integer in the range [30, 100]
.
解题步骤
这又是一道可以用Stack来解决的问题。
- 建立降序栈
stk
,存temperatures
数组对应的 index - 建立返回数组
rets
并且初始化为0 - 遍历
temperatures
数组:- 每一个元素
temp
和stk
的栈顶元素对应值比较,如果temp
较大,说明遇到了 warmer temperature,所以在rets
中更新栈顶元素对应的值,并且 pop 栈顶元素 - 重复上述过程,直到
stk
为空或者temp
比栈顶值小,将当前index
进栈
- 每一个元素
示例代码(CPP)
1 | class Solution { |
示例代码(PYTHON)
1 | class Solution(object): |
复杂度分析
因为每个字符push
和pop
都是最多一次,所以:
- 时间复杂度:
O(n)
- 空间复杂度:
O(n)
总结归纳:
运用Stack的题目很多,这类问题的做法是遍历输入数组,当前元素与栈顶元素比较,如果当前元素更优(不同题目条件不同,比如本题对应当前元素较大)则pop栈顶元素,直到栈顶元素更优为止,而后插入当前元素。
类似的题目还有:
[LeetCode 316] Remove Duplicate Letters 移除重复字母
最近会总结更多这类题目更新在Stack Tag中,尽请期待,吃香蕉去了:)