day-59 代码随想录算法训练营(19)单调栈 part 02

503.下一个更大的元素||

思路一:单调栈+取模
  • 涉及循环数组,直接把遍历的下标翻倍,然后查找和赋值时下标进行取模
class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        stack<int>st;
        int n=nums.size();
        vector<int>res(n,-1);
        for(int i=0;i<n*2;i++){//遍历下标翻倍
            while(!st.empty() && nums[i%n]>nums[st.top()]){//查找时进行取模
                cout<<i<<endl;
                res[st.top()]=nums[i%n];//赋值时进行取模
                st.pop();
            }
            st.push(i%n);//压入时进行取模(压入的是下标)
        }
        return res;
    }
};

42.接雨水

思路一:单调栈 + 分块计算
class Solution {
public:
    int trap(vector<int>& height) {
        //思路一:两个单调栈(一前一后)
        stack<int>st;
        int n=height.size();
        int res=0;
        st.push(0);
        for(int i=1;i<n;i++){
            //相同柱子算出的高度为 0 
            while(!st.empty() && height[i] > height[st.top()]){
                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;//雨水的宽度
                    res+=h*w;//加上雨水的面积
                }
            }
            st.push(i);
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/Ricardo_XIAOHAO/article/details/133190544