LeetCode 739. 每日温度
Posted hurryxin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 739. 每日温度相关的知识,希望对你有一定的参考价值。
1. 问题描述
(LeetCode 739. 每日温度)[https://leetcode-cn.com/problems/daily-temperatures/]
2. 问题分类
- 栈(单调栈)
3. 问题解析
Reference: https://leetcode-cn.com/problems/daily-temperatures/solution/mei-ri-wen-du-by-leetcode/
- 假设
T[0]=10; T[10]=20; T[20]=20;
则T[20]
不会是T[0]
答案 - 假设
T[0]=10; T[10]=10; T[20]=20;
则T[20]
可能是T[0]
答案
3.1 算法思想
- 从数组末尾依次遍历至数组首部,维护一个单调栈(存储数组元素下标)
- 若
!st.empty()&&T[i]>=T[stack.top()]
,则一直执行pop()
,此处必须是>=
,因为温度相等不能算提升,因此需要pop()
- 若栈为空则为
0
,否则为stack.top()-i
- 将新的数组下标入栈
3.2 举个栗子
t=[73,74,75,71,69,72,76,73]
- 当
i = 7
,ans[i] = 0
,stack = [7 (73)]
。 - 当
i = 6
,pop()
,ans[i] = 0
,stack = [6 (76)]
。 - 当
i = 5
,ans[i] = 1
,stack = [5 (72), 6 (76)]
。 - 当
i = 4
,ans[i] = 1
,stack = [4 (69), 5 (72), 6 (76)]
。 - 当
i = 3
,pop()
,ans[i] = 2
,stack = [3 (71), 5 (72), 6 (76)]
。
……
4. 算法实现
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
if(T.empty()) return {};
stack<int> st;
vector<int> res(T.size(),0);
for(int i=T.size()-1;i>=0;i--)
{
while(!st.empty()&&T[st.top()]<=T[i]) st.pop();
res[i]=st.empty()?0:st.top()-i;
st.push(i);
}
return res;
}
};
以上是关于LeetCode 739. 每日温度的主要内容,如果未能解决你的问题,请参考以下文章