Day59 单调栈part02 503. 下一个更大元素 II 42. 接雨水

Day59 单调栈part02 503. 下一个更大元素 II 42. 接雨水

503. 下一个更大元素 II

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        vector<int> result(nums.size(),-1); 
        stack<int> st;
        st.push(0);
        for(int i = 1; i<nums.size()*2;i++){
            if(nums[i% nums.size()]<=nums[st.top()]) st.push(i% nums.size());
            else{
                while(!st.empty()&&nums[i% nums.size()]>nums[st.top()]){
                    result[st.top()] = nums[i% nums.size()];
                    st.pop();
                }
                st.push(i% nums.size());
            }
        }
        return result;
    }
};

42. 接雨水

暴力法

class Solution {
public:
    int trap(vector<int>& height) {
        int sum = 0;
        for (int i = 0; i < height.size(); i++) {
            int rHeight = height[i]; // 记录右边柱子的最高高度
            int lHeight = height[i]; // 记录左边柱子的最高高度
            for (int r = i + 1; r < height.size(); r++) {
                if (height[r] > rHeight) rHeight = height[r];
            }
            for (int l = i - 1; l >= 0; l--) {
                if (height[l] > lHeight) lHeight = height[l];
            }
            int h = min(lHeight, rHeight) - height[i];
            if (h > 0) sum += h;
        }
        return sum;
    }
};

单调栈

class Solution {
public:
    int trap(vector<int>& height) {
        int result =0;
        stack<int> stk;
        stk.push(0);

        for(int i = 1;i<height.size();i++){
            while(!stk.empty()&& height[i] > height[stk.top()]){
                int mid = stk.top();
                stk.pop();
                if(!stk.empty()){
                    int h = min(height[stk.top()],height[i]) - height[mid];
                    int w = i - stk.top() -1;
                    result += h*w;
                }
            }
            stk.push(i);
        }
        return result;
    }
};

你可能感兴趣的:(代码随想录刷题,动态规划,算法,数据结构,leetcode,c++)