739.每日温度
要点:求当前元素的下一个更大元素,并在结果数组中,当前元素的索引位置,放入与更大元素索引的差值,单调栈的经典题目,要模拟栈中数据弹出和入栈的过程。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> st;
vector<int> res(temperatures.size(), 0);
st.push(0);
for (int i = 1; i < temperatures.size(); ++i) {
while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
res[st.top()] = i - st.top();
st.pop();
}
st.push(i);
}
return res;
}
};
496.下一个更大元素I
要点:与上一题的变化,num1为num2的子集,也是求当前元素的下一个更大元素,并在当前元素的索引位置放入查找到的更大元素,但是如果这个当前元素不在num1里,就不用管
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
vector<int> res(nums1.size(), -1);
stack<int> st;
unordered_map<int,int> umap;
for (int i = 0; i < nums1.size(); ++i) {
umap[nums1[i]] = i;
}
st.push(0);
for (int i = 1; i < nums2.size(); ++i) {
while (!st.empty() && nums2[i] > nums2[st.top()]) {
if (umap.count(nums2[st.top()]) > 0) {
int index = umap[nums2[st.top()]];
res[index] = nums2[i];
}
st.pop();
}
st.push(i);
}
return res;
}
};
503.下一个更大元素II
要点:求当前元素的下一个更大元素,并在当前元素的索引位置放入查找到的更大元素;但是当整个数组的最大元素在数组中间时,数组后方的元素有可能找到下一个更大的元素,需要再遍历一次数组,而遍历两次数组的方法,要么把原数组再加上一个原数组,要么for循环的次数范围,索引 i 的取值由 i 变成 i % nums.size()
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
stack<int> st;
vector<int> res(nums.size(), -1);
st.push(0);
for (int i = 1; i < nums.size() * 2; ++i) {
while (!st.empty() && nums[i % nums.size()] > nums[st.top()]) {
res[st.top()] = nums[i % nums.size()];
st.pop();
}
st.push(i % nums.size());
}
return res;
}
};