随想录训练营51/60 | LC 503.下一个更大元素II;LC 42. 接雨水

文章介绍了两道LeetCode编程题,LC503.下一个更大元素II和LC42.接雨水,都涉及到使用单调栈。在LC503中,通过两次遍历循环数组找到每个元素的下一个更大元素;在LC42中,利用单调栈计算每个柱子可以接的雨水量,从而求得总雨水量。
摘要由CSDN通过智能技术生成

LC 503.下一个更大元素II

题目链接LC 503.下一个更大元素II
思路:与上一章节的题目不同之处为循环数组,因此遍历两边数组即可。
代码

class Solution {
public:
    //重要的是终止条件,可以直接进行两次遍历
    vector<int> nextGreaterElements(vector<int>& nums) {
        int count = 0;//统计处理过的数的数目
        vector<int> result(nums.size(), -1);
        stack<int> st;
        st.push(0);//将下标保存下来。为什么都要保存下标,因为要通过下标,对对应位置的数组进行赋值
        int i = 1;//遍历的下标
        for(int i=1; i<nums.size()*2; i++){
            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;
    }
};

LC 42. 接雨水

题目链接LC 42. 接雨水
思路:找到某元素右边第一个更大元素使用的单调递增栈,为什么叫递增栈,是因为栈取元素时只能从栈顶到栈底,然后栈顶到栈底元素值越来越大的就是递增栈。
在用单调栈模拟接雨水的过程中模拟的是横向来统计雨水量
主要思路为:
1.找到每个柱子(栈顶的柱子)的左右两边距离最近的比它高的柱子,首先右边比它高的柱子就是遍历的柱子,左边比它高的柱子为栈顶下面的柱子;
2.统计两个柱子之间的距离以及两边柱子与栈顶柱子的高度差,来计算雨水量。
代码

class Solution {
public:
    //本质就是找到下一个更大的数,但是在找到下一个更大数的同时要统计目前能接的雨水数目
    int trap(vector<int>& height) {
        if(height.size()<=2)return 0;//特殊情况直接返回
        int result = 0;
        stack<int> st;//创建栈
        st.push(0);//将第一个下标入栈
        for(int i=1; i<height.size(); i++){
            while(!st.empty() && height[i]>height[st.top()]){
                int cur = st.top();//首先保存栈顶元素下标
                st.pop();//然后弹出栈顶元素,找到栈顶元素下面的元素
                if(st.empty())break;
                result = result + (min(height[i], height[st.top()])-height[cur]) * (i-st.top()-1);
            }
            st.push(i);
        }
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值