LintCode:接雨水

题目描述:

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.


样例

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

分析:双指针操作,只要注意处理好细节就可以了

public class Solution {
    /**
     * @param heights: a list of integers
     * @return: a integer
     */
    public int trapRainWater(int[] heights) {
        int i=0;
        int area=0;
        while(i<heights.length-1){
        	if(heights[i]==0){
        		i++;
        	}
        	else{
        		int j=i+1;
        		int max=i+1;
        		while(j<heights.length && heights[j]<heights[i]){       			
        			if(max<heights.length && heights[j]>heights[max]){
        				max=j;
        			}
        			j++;
        		}
        		if(j<heights.length){
        			int sum=0;
        			for(int k=i+1; k<j; k++){
        				sum+=heights[k];
        			}
        			area+=(j-i-1)*Math.min(heights[i], heights[j])-sum;
            		i=j;
        		}
        		else{
        			int sum=0;
        			for(int k=i+1; k<max; k++){
        				sum+=heights[k];
        			}
        			area+=(max-i-1)*Math.min(heights[i], heights[max])-sum;
    				i=max;
        		}       		
        	}
        }
        return area;
    }
}

猜你喜欢

转载自blog.csdn.net/karute/article/details/79949508