前言
LeetCode题目:LeetCode 739、496
Takeaway:单调栈系列问题,重点是理解栈的使用方法和逻辑。
一、503
这道题的精髓和特点就是数组乘二加取余来模拟循环数组。
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
vector<int> ans(nums.size(), -1);
stack<int> st;
st.push(0);
// 这道题的精髓和特点就是数组乘二加取余来模拟循环数组
for(int i=1; i<nums.size()*2; i++){
// 1, 栈顶元素大于新元素
if(nums[st.top()] > nums[i%nums.size()]) {
st.push(i%nums.size());
} else if(nums[st.top()] == nums[i%nums.size()]) { // 2, 栈顶元素等于新元素
st.push(i%nums.size());
} else { // 3, 栈顶元素小于新元素
while(!st.empty() && nums[st.top()] < nums[i%nums.size()]){
int cur = st.top();
st.pop();
ans[cur] = nums[i%nums.size()];
}
st.push(i%nums.size());
}
}
return ans;
}
};
二、42
这道题是对单调栈的另一种使用方法,活用了里面的元素,重点在 mid和top的同时使用,用三个元素来计算。
class Solution {
public:
int trap(vector<int>& height) {
int ans = 0;
stack<int> st;
st.push(0);
for(int i=1; i<height.size(); i++) {
// 1, 栈顶元素 大于 新元素
if(height[st.top()] > height[i]) {
st.push(i);
}else if(height[st.top()] == height[i]) { // 2,栈顶元素 等于 新元素
st.pop();
st.push(i);
}else { // 3,栈顶元素 小于 新元素
while(!st.empty() && height[st.top()] < height[i]) {
int mid = st.top();
st.pop();
if(!st.empty()) {
int h = min(height[st.top()], height[i]) - height[mid];
int w = i - st.top() - 1;
ans += h*w;
}
}
st.push(i);
}
}
return ans;
}
};
总结
单调栈系列问题,重点是理解栈的使用方法和逻辑。