单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。
4.单调栈需要判断的条件
由于题目中需要找到右边第一个比今天大的温度,与单调栈的思路相匹配,所以本题使用单调栈来解决问题。
st存放的是顺序遍历时还未找到右边第一个比今天大的温度。
ret存放的是对应的右边第一个比今天大的温度数组,默认情况下全为-1。
- while(!st.empty()&&temperatures[st.top()] < temperatures[i]){
- ret[st.top()] = i - st.top();
- //cout<<st.top()<<i-st.top()<<endl;
- st.pop();
- }
- st.push(i);
- class Solution {
- public:
- vector<int> dailyTemperatures(vector<int>& temperatures) {
- stack<int> st;//存放的是下标
- int n = temperatures.size();
- vector<int> ret(n,0);
- st.push(0);
- for(int i = 1;i<n;i++){
- //cout<<st.top()<<temperatures[st.top()]<<i-st.top()<<endl;
- if(temperatures[st.top()]>temperatures[i]){
- st.push(i);
- }else if(temperatures[st.top()]== temperatures[i]){
- st.push(i);
- }else{
- while(!st.empty()&&temperatures[st.top()] < temperatures[i]){
- ret[st.top()] = i - st.top();
- //cout<<st.top()<<i-st.top()<<endl;
- st.pop();
- }
- st.push(i);
- }
- }
- return ret;
- }
- };