给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1java
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方图,在这种状况下,能够接 6 个单位的水(蓝色部分表示水)数组
输入示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6
思考: 一、只要左右两边墙比我自己高,那么我就能够注水成功,可是同时考虑边状况比较复杂 一、所以咱们先思考先知足一边注水成功的状况,只要一边上的位置比我当前高,那么我就能够注水 二、所以咱们能够获得从左往右注水,和从左往右注水的状况,只要取他们的交集就好了 解题方式: 一、先从左往开始遍历,只要右边的位置比左边最高的低,咱们就给它注水,以下图第一个图所示 二、再从右往左遍历,只要左边的位置比右边低,咱们仍是给它注水,以下图第二个图所示 三、从两个遍历的数组中,选取每一个位置最小值进行相加便可获得咱们的最终结果。
下图就是取交集后的结果code
package com.java; import java.util.Stack; public class Day02_Solution { public int trap(int[] height) { int[] leftMax = new int[height.length]; int[] rightMax = new int[height.length]; int sum=0; int max=0; for(int i=0;i<height.length;i++) { if (max < height[i]) { max = height[i]; } leftMax[i] = max - height[i]; } max = 0; for (int i=height.length-1;i>=0;i--) { if (max < height[i]) { max = height[i]; } rightMax[i] = max - height[i]; } for (int i=0;i<height.length;i++) { sum = sum + (rightMax[i] < leftMax[i] ? rightMax[i]:leftMax[i]); } return sum; } }