前言
什么时候用单调栈?要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置。
整体逻辑有点儿绕,从右至左,从左至右逻辑捋清楚。
题目
739. 每日温度
思路一:从右至左形成单调栈
从右至左遍历,保证栈底至栈顶对应位置元素严格递减。若当前i对应Temperature大于栈中所有元素,就将栈中元素pop出来,直到满足递减;如果栈非空,i相减就得到相隔位置。最后把当前元素i进栈。
需要注意的是,栈内元素是位置(i)不是温度
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int>st;
vector<int> result(temperatures.size());
for(int i=temperatures.size()-1;i>=0;i--){
while(!st.empty()&&temperatures[i]>=temperatures[st.top()]){
st.pop();
}
if(!st.empty()){
result[i]=st.top()-i;
}
st.push(i);
}
return result;
}
};
思路二:从左至右遍历
从左至右,如果没遇到比当前元素大的就先将i填入,遇到比栈顶大的就计算i的差值,栈顶元素弹出,栈内i对应的元素继续保持单调。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int>st;
vector<int> result(temperatures.size());
for(int i=0;i<temperatures.size();i++){
while(!st.empty()&&temperatures[i]>temperatures[st.top()]){
result[st.top()]=i-st.top();
st.pop();
}
st.push(i);
}
return result;
}
};
496.下一个更大元素 I(好好理解逻辑)
思路:本题有两个数组,这要怎么操作?
从右至左
先将nums1数组元素加入到中unordered_map中去,方便查找。
num2中元素未必全部能用到。以测试用例1为例:nums1=[4,1,2],nums2 =[1,3,4,2]。4,2后面没有比它大的元素了,无法形成递增单调栈,统统pop;3不再nums1里面,也跳过。
整个过程就是:
nums2中,2的i进栈(3(2));4大于2,不是递增的,2pop,4进栈继续(4(3));3小于4,但是3不再nums1里面,进栈继续(1(3),2(4));1小于3,栈顶元素大于它,且nums1里有它,此时栈顶元素i对应的nums[i],即3,就是答