文章目录
- 每日温度
- 下一个更大的元素 I
- 下一个更大的元素 II
每日温度
通常是一维数组,要寻找任一个元素的右边或者左边,第一个比自己大或者小的元素的位置,此时我们就可以用单调栈
只有把栈中比当前元素小的元素全部出栈,才能把当前元素入栈,栈中元素一定是降序的(栈底->栈顶)
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
vector<int> ans(n, 0);
stack<int> st;
for(int i = 0; i < n; i++){
while(!st.empty() && temperatures[i] > temperatures[st.top()]){
// 栈不空,下一个温度更高,则出栈,更新ans
ans[st.top()] = i - st.top();
st.pop();
}
st.push(i);
}
return ans;
}
};
下一个更大的元素 I
用单调栈处理nums2,将有下一个更大元素的值,和其对应的下一个更大元素用哈希表记录下来,遍历nums1,即可得到答案
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int> st;
unordered_map<int, int> mp; // <val, next_max_val>
for (int i = 0; i < nums2.size(); i++) {
while (!st.empty() && nums2[st.top()] < nums2[i]) {
mp[nums2[st.top()]] = nums2[i];
st.pop();
}
st.push(i);
}
vector<int> ans(nums1.size(), -1);
for (int i = 0; i < nums1.size(); i++) {
if (mp.find(nums1[i]) != mp.end()) {
ans[i] = mp[nums1[i]];
}
}
return ans;
}
};
下一个更大的元素 II
将最大值第一次出现的位置前面所有元素搬到数组后面,后续按照单调栈相同思路解题
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int n = nums.size();
// 最大值第一次出现的下标
int max_idx = max_element(nums.begin(), nums.end()) - nums.begin();
vector<int> ans(n, -1);
for(int i = 0; i <= max_idx; i++){
nums.push_back(nums[i]); // 将最大值第一次出现的位置前面所有元素搬到数组后面
}
stack<int> st;
for(int i = 0; i < nums.size(); i++){
while(!st.empty() && nums[st.top()] < nums[i]){
if(st.top() >= n){
// 大于ans的范围了,不填写ans,直接pop,进行下一次栈顶元素的比较
st.pop();
continue;
}
ans[st.top()] = nums[i];
st.pop();
}
st.push(i);
}
return ans;
}
};
vector<int> nextGreaterElements(vector<int>& nums) {
int n = nums.size();
stack<int> st;
vector<int> ans(n, -1);
for(int i = 0; i < 2 * n; i++){
while(!st.empty() && nums[st.top()] < nums[i % n]){
ans[st.top()] = nums[i % n];
st.pop();
}
st.push(i % n);
}
return ans;
}