Hard-题目7:42. Trapping Rain Water

题目原文:
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

For example,
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.
题目大意:
给出n个非负整数数组,其中height[i]代表坐标轴上横坐标为[i,i+1]的矩形的高度,计算这些矩形和x轴围成的“容器”能装多少水。
题目分析:
本题是Middle-题目31的变形,也是用两个指针i和j分别指向数组头和结尾,记两边矩形的高度分别为height[i]和height[j],分两种情况讨论:
(1) height[i]<height[j],则i向右移动,如果后面矩形的高度小于height[i],则其高度差值一定可以装水(因为j那边比i高,不管中间是什么情况,j那侧一定不是“短板”,如果后面矩形的高度大于Height[i],则停止滑动i,因为已经找到一个“杯子”并计算出它的水量了。
(2) height[i]>height[j],同理j向左移动,找到一个高度大于等于height[j]的矩形,并记录差值(可以装水)。
等于的情况放到任何一种里面都可以,因为等于的时候装水量为0,最终到I,j相遇时循环停止。整个数组只扫描了一遍。
源码:(language:java)

public class Solution {
    public int trap(int[] height) {
        int res=0;
        int l=0;
        int r=height.length-1;
        while(l<r){
            int temp=Math.min(height[l],height[r]);
            if(temp==height[l]){
                l++;
                while(l<r&&height[l]<=temp){
                    res+=temp-height[l];
                    l++;
                }

            }
            else{
                 r--;
                 while(l<r&&height[r]<=temp){
                    res+=temp-height[r];
                    r--;
                }

            }
        }
        return res;
    }
}

成绩:
1ms,beats 87.85%,众数2ms,71.18%
Cmershen的碎碎念:
也没什么要注意的,认真理解了上一题之后本题变化也不是很大。关键是注意“寻找杯子”的过程。

你可能感兴趣的:(Hard-题目7:42. Trapping Rain Water)