LintCode:接雨水


给出 n 个非负整数,代表一张X轴上每个区域宽度为 1 的海拔图, 计算这个海拔图最多能接住多少(面积)雨水。

接雨水

您在真实的面试中是否遇到过这个题?

Yes





样例

如上图所示,海拔分别为 [0,1,0,2,1,0,1,3,2,1,2,1], 返回 6.

挑战

O(n) 时间, O(1) 空间

O(n) 时间, O(n) 空间也可以接受
标签 Expand   



相关题目 Expand   

解题思路:
方法1:O(n)时间,O(n)空间
该点雨水的存储,实际就是该点就是取左边最大值和右边最大值得更小的,减去改点的高度。
从左像右扫描,记录左边最大值,从右向左扫描记录右边最大值。

方法2:左右指针夹逼
该点雨水的存储,实际就是该点就是取左边最大值和右边最大值得更小的,减去改点的高度。
2个指针,一个在头,一个在尾。由于他们2者之间肯定有个最高点,相当于左指针的右最大值,相当于右指针的左最大值。

扫描一遍即可。

public class Solution {
    /**
     * @param heights: an array of integers
     * @return: a integer
     */
    public int trapRainWater(int[] heights) {
        // write your code here
        int res = 0;
         if(heights==null||0==heights.length) return res;
         int len = heights.length;
         int l = 0 ; int r = len-1;
         int lmax = 0; int rmax = 0;
         while(l<r){
              lmax = Math.max(lmax, heights[l]);
              rmax = Math.max(rmax, heights[r]);
              if(lmax>rmax){
                   res += rmax-heights[r];
                   r--;
              }else{
                   res += lmax-heights[l];
                   l++;
              }
         }
         return res;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值