503. 下一个更大元素 II(题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台)
思路:和昨天的单调栈做法是一样的,用一个栈存放暂未获得结果的数组元素,只不过变成了循环数组,因此需要两次for循环遍历。
vector<int> nextGreaterElements(vector<int>& nums) {
int size = nums.size();
vector<int> result(size, -1);
stack<int> st;
st.push(0);
int count=2;
while(count--){
for(int i=1; i<size; i++){
if(nums[i]<=nums[st.top()] && i!=st.top()){
st.push(i);
}else{
while(!st.empty() && nums[i]>nums[st.top()]){
result[st.top()] = nums[i];
st.pop();
}
st.push(i);
}
}
}
for(int i=0; i<size; i++){
while(!st.empty() && nums[i]>nums[st.top()]){
result[st.top()] = nums[i];
st.pop();
}
}
return result;
}
42. 接雨水(题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台)
思路:双指针做法:从两边往中间计算,先算出对于每个节点而言,以该节点为盆底的盆左右两边的高度。然后直接for循环遍历数组求出结果。单调栈做法:每次满足条件从栈中push出来元素时,尝试构建一个盆地,计算能够装多少水(初步理解如果没有挨在一起的元素相等的情况的话,宽度为1)。
双指针:
int trap(vector<int>& height) {
int size = height.size();
vector<int> leftHeight(size, 0);
vector<int> rightHeight(size, 0);
leftHeight[0] = height[0];
for(int i=1; i<size-1; i++){
leftHeight[i] = max(height[i], leftHeight[i-1]);
}
rightHeight[size-1] = height[size-1];
for(int i=size-2; i>0; i--){
rightHeight[i] = max(height[i], rightHeight[i+1]);
}
int result=0;
for(int i=1; i<size-1; i++){
result += min(leftHeight[i], rightHeight[i]) - height[i];
}
return result;
}
单调栈:
int trap(vector<int>& height) {
int size = height.size();
stack<int> st;
st.push(0);
int result = 0;
for(int i=1; i<size; i++){
if(height[i]<height[st.top()]){
st.push(i);
}else if(height[i]==height[st.top()]){
st.pop();
st.push(i);
}else{
while(!st.empty() && height[i]>height[st.top()]){
int mid = st.top();
st.pop();
if(!st.empty()){
int h = min(height[i], height[st.top()]) - height[mid];
int w = i - st.top() - 1;
result += h*w;
}
}
st.push(i);
}
}
return result;
}