739. 每日温度
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> st;
st.push(0);
int n=temperatures.size();
vector<int> res(n,0);
for(int i=1; i<n; i++){
while(!st.empty()&&temperatures[i]>temperatures[st.top()]){
res[st.top()]=i-st.top();
st.pop();
}
st.push(i);
}
return res;
}
};
单调栈存的是索引,返回值记录的也是索引间隔。
单调栈的核心思想是利用while循环批量处理栈顶元素,使剩下的栈内元素保持单调。
496. 下一个更大元素 I
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int, int> value_idx;
for (int i = 0; i < nums1.size(); i++) {
value_idx[nums1[i]] = i;
}
vector<int> res(nums1.size(), -1);
stack<int> st;
st.push(0);
for (int i = 1; i < nums2.size(); i++) {
while (!st.empty() && nums2[i] > nums2[st.top()]) {
if (value_idx.count(nums2[st.top()])) {
res[value_idx[nums2[st.top()]]] = nums2[i];
}
st.pop();
}
st.push(i);
}
return res;
}
};
和上题基本一致,利用value_idx构造结果。
503. 下一个更大元素 II
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int n=nums.size();
vector<int> nums2(nums.begin(),nums.end());
nums.insert(nums.end(),nums2.begin(),nums2.end());
vector<int> res(2*n,-1);
stack<int> st;
st.push(0);
for(int i=1; i<2*n; i++){
while(!st.empty()&&nums[i]>nums[st.top()]){
res[st.top()]=nums[i];
st.pop();
}
st.push(i);
}
res.resize(n);
return res;
}
};
和1题基本一致,用拼接的方式实现伪循环