Leetcode739
1.问题描述
2.解决方案
解法一:暴力
首先想到的当然是暴力解法,两层for循环,把至少需要等待的天数就搜出来了。时间复杂度是O(n^2)
解法二:单调栈
(1)单调栈概述
1.我怎么能想到用单调栈呢? 什么时候用单调栈呢?-
--------->通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。
2.那么单调栈的原理是什么呢?为什么时间复杂度是O(n)就可以找到每一个元素的右边第一个比它大的元素位置呢?
--------->单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素的元素,优点是只需要遍历一次。
(2)单调栈考虑的点
(3)举例说明
(4)代码实现
1.其实就是如果你加入的值是大于栈顶的,那么意味着栈顶元素右边第一个比自己大的值来了,这时候栈顶要出栈同时也会得出栈顶元素的答案
2.也就是有删除才有得到结果的更新,没有删除就递减排下去!
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
//1.递减栈
stack<int> st;
vector<int> result(temperatures.size(), 0);
//2.遍历,只加入下标
st.push(0);
for(int i=1;i<temperatures.size();i++) {
//情况一;当前栈顶元素T[st.top()]>遍历的元素T[i]
if(temperatures[st.top()]>temperatures[i]) {
st.push(i);
continue;
}
//情况二;当前栈顶元素T[st.top()]==遍历的元素T[i]
if(temperatures[st.top()]==temperatures[i]){
st.push(i);
continue;
}
//情况三;当前栈顶元素T[st.top()]>遍历的元素T[i]---有删除才有结果更新
if(temperatures[st.top()]<temperatures[i]){
while(st.empty()==false&&temperatures[st.top()]<temperatures[i]){
result[st.top()]=i-st.top();
st.pop();
}
st.push(i);
continue;
}
}
return result;
}
};