LeetCode 42.Trapping-Rain-Water<接雨水>

题目是:

 慢到极致就是快,因为思路太简单了。从看题到解题大概一个小时多。

思路是:

这题我一看嗷,就和水桶那题差不多leetcode 11题LeetCode 11.盛最多水的容器_Eminste的博客-CSDN博客

然后呢有一点 , 不一样就是他是水桶里面有东西的(或者说是有方块占用了空间),

  1. 我们先从两边开始扫面,取短的那条柱子;
  2. 然后cmp是表示这一层的水
  3. 我们先取cmp层的水,假设水不流动.
  4. 那么取完之后我们将这一层的水全部变成方块.在代码神之一笔处.
  5. 因为每一次取水都是大于上一次cmp的所以不会重复取水,(大于原cmp,且原来的水取完后都被放上方块了.

图解:

开始:

第一次i到1,j还是len=11; 

取水之后;

sum=2;第二次取水 i = 3 , j = 10;

 

 sum=6;

但是如果不将取过水的位置用小方块代替,那么箭头位置会取水两次加二,最后sum也就变成7了,

 

代码是: 

class Solution {
public:
    int trap(vector<int>& height) {
        int len = height.size() - 1;
        int cmp = 0, sum = 0;
        for(int i = 0,j = len ; i < j ; ){
            if( min( height[i], height[j] ) > cmp ){
                cmp=min( height[i], height[j] );
                for(int star=i+1 ; star < j; star++){
                    if(height[star]<cmp){
                        sum=sum+cmp-height[star];
                        height[star]=cmp;//神之一笔
                    }
                }
            }else{
                height[i] <= height[j] ? i++ : j--;
            }
        }
        return sum;
    }
};

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值