LeetCode-42栈算法C++实现

leetcode-42
代码如下,使用语言C++
使用算法,栈的应用

class Solution {
public:
    int trap(vector<int>& height) {
     
        int sum=0;
        stack<int> ts;
        for(int i=0;i<height.size();i++)
        {
            while(!ts.empty()&&height[ts.top()]<height[i])
            {
                int top=ts.top();
                ts.pop();
                if(ts.empty()) break;
                int distance=i-ts.top()-1;
                int the_cal_height=min(height[ts.top()],height[i])-height[top];
                sum+=distance*the_cal_height;
            }
            ts.push(i);
        }
        return sum;
    }
};

将整个向量读入过程,加入栈。
当读入的向量索引对应高度大于栈顶索引对应高度时,开始弹出,直到栈顶元素索引对应高度大于读入元素索引对应高度为止。
弹出的元素进行计算,弹出后栈顶元素对应格子与读入格子之间距离,乘以计算高度。
计算高度求法,弹出元素后栈顶索引对应高度与读入元素索引对应高度之中取小,减去弹出元素。
水量增加=距离*计算高度
值得注意的是栈压入和弹出的不是高度,而是高度索引。

时间复杂度:O(n)。
单次遍历 O(n),每个条形块最多访问两次(由于栈的弹入和弹出),并且弹入和弹出栈都是 O(1)的。
空间复杂度:O(n)。 栈最多在阶梯型或平坦型条形块结构中占用 O(n)的空间。
这道题也可以用dp来解,有时间再说。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值