Day58_单调栈
1. 每日温度
739. 每日温度
思路:
单调栈
维护从栈顶到栈底单调递增
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
vector<int> result(n, 0);
stack<int> stk;
stk.push(0);
for (int i = 1; i < n; i++) {
if (temperatures[i] <= temperatures[stk.top()]) { // 当前温度小于或等于栈顶温度,加入栈中
stk.push(i);
} else {
while (!stk.empty() && temperatures[i] > temperatures[stk.top()]) { // 栈不空,则弹出小于当前温度的所有温度
result[stk.top()] = i - stk.top();
stk.pop();
}
stk.push(i);
}
}
return result;
}
};
简化写法
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
vector<int> result(n, 0);
stack<int> stk;
stk.push(0);
for (int i = 1; i < n; i++) {
while (!stk.empty() && temperatures[i] > temperatures[stk.top()]) {
result[stk.top()] = i - stk.top();
stk.pop();
}
stk.push(i);
}
return result;
}
};
2. 下一个更大元素 I
496. 下一个更大元素 I
思路:
对nums2维护一个单调栈,开一nums1.size()大小的答案数组,维护单调栈的过程中,判断栈顶元素是否是nums1中的元素,如果是,则更新答案
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
int nums1_size = nums1.size();
int nums2_size = nums2.size();
vector<int> result(nums1_size, -1);
if (nums1_size == 0) return result;
stack<int> stk;
stk.push(0);
unordered_map<int, int> umap;
for (int i = 0; i < nums1_size; i++) umap[nums1[i]] = i;
for (int i = 1; i < nums2_size; i++) {
while (!stk.empty() && nums2[i] > nums2[stk.top()]) {
if (umap.count(nums2[stk.top()]) > 0) { // 判断栈顶元素是否在nums1中,如果在则记录答案
result[umap[nums2[stk.top()]]] = nums2[i];
}
stk.pop();
}
stk.push(i);
}
return result;
}
};