题意:
一个一维地面,凹凸不平.给你一个数组,数组的每个数字x,代表地面这个位置的高度.
向这个地面灌水,问最多能留住多少水.
思路:
对每一个位置的水面高度,需要同时考虑它左边能承受的最大高度和右边能承受的最大高度,再取min.
它左边能承受的最大高度,实际上就是它左边所有位置高度的最大值,右边也是同理.
因此我们先从左往右扫描,一边更新最大高度,一边得到每个位置左边能承受的最大高度,然后从右往左扫描,得到右边能承受的最大高度.
最后每个位置取min,再减去它的高度,就是它能留住的水的体积,之后求个和即可.
时间复杂度是O(n).
总结:
把一个点的水面高度,分开成左右能承受的最大高度,然后从左往右扫描和从右往左扫描求解.
public class TrappingRainWater { public static int trap(int[] height) { if(height.length<=2){ return 0; } int leftMax[]=new int[height.length]; int rightMax[]=new int[height.length]; int leftTempMax=height[0]; for (int i = 1; i < height.length; i++) { if(height[i-1]>leftTempMax){ leftTempMax=height[i-1]; } leftMax[i]=leftTempMax; } rightMax[height.length-2]=height[height.length-1]; int rightTempMax=rightMax[height.length-2]; for (int j = height.length-3; j >=1; j--) { if(height[j+1]>rightTempMax){ rightTempMax=height[j+1]; } rightMax[j]=rightTempMax; } int sum=0; for (int i = 1; i < height.length-1; i++) { int tempHeight=leftMax[i]>rightMax[i]? rightMax[i]:leftMax[i]; if(tempHeight-height[i]>0) { sum += tempHeight - height[i]; } } return sum; } public static void main(String[] args) { int[] height={0,1,0,2,1,0,1,3,2,1,2,1}; System.out.println(trap(height)); } }