LeetCode: Trapping Rain Water

本文介绍了一种雨水捕捉问题的算法解决方案,通过遍历每个柱子并寻找可以形成“桶”的结构来计算能捕捉多少雨水。该算法区分两种情况:当前柱子高度小于等于后续柱子时形成的“桶”,以及当前柱子高度大于后续柱子但中间柱子不超过后续柱子时形成的“桶”。整个算法的时间复杂度为O(n^2),适用于解决雨水捕捉问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:

从当前位置pos的柱子开始,搜索后面的柱子A[k],k = pos+1,...,n,A[k]有两种情况:

1)A[k] >= A[pos],且k - pos > 1,此时组成一个“桶”,注意:此时他们的桶底是中间(pos 到 k中间)高度最高的柱子,桶底与这根柱子顶部平行,在这种情况下,就不用往后搜索了,因为A[k]阻止了A[pos]与后面的柱子形成通;

2) A[k] < A[pos],只要 k - pos >1,而且中间位置(pos 到 k)的最高的柱子不超过A[k],也能形成一个桶,当然这个情况下,还是向后搜索,因为此时A[k]不能阻止A[pos]与后面的柱子形成“桶”。

注意中间位置的高度的记录,每次保留已经搜索的最大值。

整个时间复杂度为O(n^2)。这个题有O(n)个解法,以后再来^_^.

code:

class Solution {
public:
    int trap(int A[], int n) {
        if(n<=1)return 0;
        int sum = 0, midHeigh;
        for(int i=0;i<n;i++){
            midHeigh = 0;
            for(int j=i+1;j<n;j++){
                if(A[j] >= A[i]){  //第一种形成“桶”情况
                    sum += ((A[i] - midHeigh)*(j-1-i));
                    break;
                }
                else{ //第二种形成“桶”情况
                    if(A[j] > 0 && midHeigh < A[j])
                        sum += (A[j] - midHeigh)*(j-1-i);
                    midHeigh = max(midHeigh,A[j]);  //更新中间位置的柱子的最高高度
                }
            }
        }
        return sum;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值