要求找下一个更高温度出现在几天后,因此栈内记录的是单调递减的序列
对于剩余元素的处理,因为如果气温在这之后都不会升高,请在该位置用 0 来代替。所以在初始化时初始为0就可以避免后续再处理剩余元素
AC代码:
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
vector<int> res(n);
int pos = 0;
stack<int> s;
for (int i = 0; i < n; ++i) {
while (!s.empty() && temperatures[i] > temperatures[s.top()]) {
res[s.top()] = i - s.top();
s.pop();
}
s.push(i);
}
return res;
}
};
先将nums1转成map,方便获取元素对应的索引 容纳后对nums2使用单调栈 注意nums1是nums2的子集,意味着nums2中有些元素nums1中没有,赋值时要注意这一点
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
int n = nums2.size();
int m = nums1.size();
map<int, int> nums1_map;
for (int j = 0; j < m; ++j) {
nums1_map.emplace(nums1[j], j);
}
vector<int> res(m, -1);
stack<int> s;
for (int i = 0; i < n; ++i) {
while (!s.empty() && nums2[i] > s.top()) {
if (nums1_map.find(s.top()) != nums1_map.end()) {
res[nums1_map[s.top()]] = nums2[i];
}
s.pop();
}
s.push(nums2[i]);
}
return res;
}
};
题目给定的是循环数组,那么在第一次遍历后处理剩余元素时就有些不同,又因为要找每个元素的 下一个更大元素,所以我们最后再从头遍历一遍,不过这次不用再往栈中添加元素,因为循环数组相当于在数组最后再拼接了一个原数组,分成两段做即可
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int n = nums.size();
vector<int> res(n, -1);
stack<int> s;
for (int i = 0; i < n; ++i) {
while (!s.empty() && nums[i] > nums[s.top()]) {
res[s.top()] = nums[i];
s.pop();
}
s.push(i);
}
for (int i = 0; i < n; ++i) {
while (!s.empty() && nums[i] > nums[s.top()]) {
res[s.top()] = nums[i];
s.pop();
}
}
return res;
}
};