classSolution{publicinttrap(int[] height){int len = height.length;if(len <3)return0;int max =0;int sum =0;//动态规划,从左往右的最大值int[] left =newint[len];//从右往左的最大值int[] right =newint[len];for(int i =0; i < len; i++){if(height[i]> max) max = height[i];
left[i]= max;}
max =0;for(int i = len -1; i >=0; i--){if(height[i]> max) max = height[i];
right[i]= max;}//两边取最小值计算和height的差值,即可找到该块的积水量for(int i =0; i < len; i++){int tmp = Math.min(left[i], right[i]);
sum += tmp - height[i];}return sum;}}
复杂度计算
时间复杂度:O(n)
空间复杂度:O(n)
方案2: 双指针
原理和动态规划类似,不同的是不需要那么多空间
classSolution{publicinttrap(int[] height){int len = height.length;if(len <3)return0;int sum =0;//左右指针int left=0;int right = len-1;int lmax=height[0];int rmax=height[len];while(left<right){//如果右边高,则先移动左边if(height[left]<=height[right]){if(height[left]>=lmax) lmax = height[left];else sum+=lmax-height[left];
left++;}else{//左边高,if(height[right]>=rmax) rmax = height[right];else sum+=rmax-height[right];
right++;}}return sum;}}