【739. 每日温度】
单调栈的第一题。
需要用到栈这个数据结构。栈里面存放的是数组的下标。
还需要一个结果数组来存放结果。
遍历的下标和栈顶元素比较,有三种情况:
下标的元素比栈顶元素小,那么将下标推入栈中
下标的元素和栈顶的元素一样,那么将下标推入栈中
下标的元素比栈顶的元素大,那么
找到了栈顶下标对应的结果:result[st.top()] = i - st.top();
把栈顶下标弹出:st.pop();
再继续比较下标的元素和栈顶的元素,直到栈为空或者下标元素不大于栈顶元素。
代码如下所示:
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> st;
vector<int> result(temperatures.size(),0);
st.push(0); //放入第一个下标
for(int i = 1; i < temperatures.size(); i++){
if(temperatures[i] <= temperatures[st.top()]){
st.push(i);
}else{
while(!st.empty() && temperatures[i] > temperatures[st.top()]){
result[st.top()] = i - st.top();
st.pop();
}
st.push(i);
}
}
return result;
}
};
【496.下一个更大元素 I】
我的思路是计算出nums2每一个元素右边最近比他大的值,存放在一个result数组中。然后再把nums1里面的数组在nums2中查询对应的结果。
使用单调栈完美解决 。
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int> st;
vector<int> result(nums2.size(), -1);
vector<int> res(nums1.size(), -1);
st.push(0);
for(int i = 1; i < nums2.size(); i++){
if(nums2[i] <= nums2[st.top()]){
st.push(i);
}else{
while(!st.empty() && nums2[i] > nums2[st.top()]){
result[st.top()] = nums2[i];
st.pop();
}
st.push(i);
}
}
for(int i = 0; i < nums1.size(); i++){
for(int j = 0; j < nums2.size(); j++){
if(nums1[i] == nums2[j]){
res[i] = result[j];
break;
}
}
}
return res;
}
};