算法Day59 | 503.下一个更大元素II, 42. 接雨水

文章讲述了使用栈解决两个LeetCode问题的算法,一个是503题《下一个更大元素II》,通过环形遍历和栈找到每个元素的下一个更大值;另一个是42题《接雨水》,利用单调栈计算能接住的雨水量,重点在于栈的使用和计算面积的方法。

503.下一个更大元素II

题目链接:503.下一个更大元素II
本题所求的为环形。数组遍历时,可将索引由i改为i % nums.size()来进行环形遍历。

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        vector<int> res(nums.size(), -1);
        stack<int> st;
        for (int i = 0; i < 2 * nums.size()/*环形遍历的终止条件*/; ++i) {
            while (!st.empty() && nums[i % nums.size()] > nums[st.top()]) {
                res[st.top()] = nums[i % nums.size()];
                st.pop();
            }
            st.push(i % nums.size());
        }
        return res;
    }
};

42. 接雨水

题目链接:42. 接雨水
单调栈可以取到大于当前元素的左右元素。右侧元素是与栈顶元素比较获得。左侧元素是由于单调栈的单调性,在栈中保存。从栈顶中弹出的元素为当前元素
通过单调栈来求解面积,是将面积按照横向求解

class Solution {
public:
    int trap(vector<int>& height) {
        stack<int> st;
        int sum = 0;
        for (int i = 0; i < height.size(); ++i) {
            while (!st.empty() && height[i] > height[st.top()]) {
                int cur = st.top();
                st.pop();
                
                //先取出当前元素cur,弹出,才能获得大于当前元素的左侧元素。
                if (!st.empty()/*确保有左侧元素*/) {
                    //求面积
                    int Height = min(height[st.top()/*左侧元素*/], height[i/*右侧元素*/]) - height[cur];
                    int Width = i - st.top() - 1;
                    sum += Height * Width;
                }
            }
            st.push(i);
        }
        return sum;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值