给定 n 个非负整数表示每一个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨以后能接多少雨水。git
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种状况下,能够接 6 个单位的雨水(蓝色部分表示雨水)。github
示例:数组
输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6
使用二分查找,找到最高的位置,今后处一分为二,A左边的从左往右遍历,B右边的从右往左遍历,spa
A左边:左边>右边, 左边-右边为雨水量;blog
B右边:右边>左边, 右边-左边为雨水量;索引
加在一块儿就是总量。get
public static int trap(int[] height) { int sum = 0;//雨水总数 int max = 0;//最大值 int maxIndex = 0;//最大值索引 for(int i =0 ;i< height.length; i++){ if (max < height[i]){ max = height[i]; maxIndex = i; } } int maxLeft = 0;//左边最大 //遍历左边,从左往右遍历 小于最大值索引 for (int a=0 ; a<maxIndex; a++){ int i = height[a]; //若是当前值大于等于左边最大值 if (i >= maxLeft){ //将当前值赋值给左边最大值 maxLeft = i; }else{ //若是当前值小于左边最大值,左边最大值减去当前值 sum+= maxLeft-i; } } int maxRight = 0;//右边最大 //遍历右边,从右往左遍历 小于最大值索引 for (int b = height.length-1; b > maxIndex; b--){ int j = height[b]; //若是当前值大于等于右边最大值 if (j >= maxRight){ //将当前值赋值给左边最大值 maxRight = j; }else{ //若是当前值小于右边最大值,右边最大值减去当前值 sum += maxRight - j; } } return sum; } public static void main(String[] args){ int[] height={0,1,0,2,1,0,1,3,2,1,2,1}; System.out.print(trap(height)); }
LeetCode 所有题目讲解与答案,可移步 GitHub:https://github.com/yan-qiang/LeetCodeit