前言
LeetCode题目:LeetCode 739、496
Takeaway:单调栈系列问题,重点是理解栈的使用方法和逻辑。
一、739
单调栈入门题。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
vector<int> ans(temperatures.size(), 0);
stack<int> s;
s.push(0);
for(int i=1; i<temperatures.size(); i++){
// 当栈顶元素 大于 或者 等于 当前元素时,说明新元素要小一些,直接入栈
if(temperatures[i] < temperatures[s.top()] || temperatures[i] == temperatures[s.top()]) {
s.push(i);
}else { // 当栈顶元素 小于 当前元素时,说明栈顶元素终于找到了第一个比它大的元素,出栈并且更新结果
while(!s.empty() && temperatures[i] > temperatures[s.top()]) {
int cur = s.top();
s.pop();
ans[cur] = i - cur;
}
s.push(i); //当前元素入栈
}
}
return ans;
}
};
二、496
比上一道题难一些,重点是加入了map可以验证其是否出现在第一个数组中并且可以用来反向找到其在第一个数组里的位置。
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
vector<int> ans(nums1.size(), -1);
stack<int> st;
st.push(0);
unordered_map<int, int> umap; // key:下标元素,value:下标
for (int i = 0; i < nums1.size(); i++) {
umap[nums1[i]] = i;
}
for(int i=1; i<nums2.size(); i++) {
// 1:新的元素小于栈顶元素
if(nums2[i] < nums2[st.top()]) {
st.push(i);
}
// 2:新的元素等于栈顶元素
if(nums2[i] == nums2[st.top()]) {
st.push(i);
}
// 3:新的元素大于栈顶元素
if(nums2[i] > nums2[st.top()]) {
while (!st.empty() && nums2[i] > nums2[st.top()]) {
if (umap.count(nums2[st.top()]) > 0) { // 看map里是否存在这个元素
int index = umap[nums2[st.top()]]; // 根据map找到nums2[st.top()] 在 nums1中的下标
ans[index] = nums2[i];
}
st.pop();
}
st.push(i);
}
}
return ans;
}
};
总结
单调栈系列问题,重点是理解栈的使用方法和逻辑。