本人的解法:
public class Main { public int trap(int[] height) { // 统计雨水总数//temp登记最大值 int sum = 0; if (height.length != 0) { int temp = height[0]; int temp2 = 0; int temp3 = height[0]; int temp4 = height[height.length - 1]; //跟踪最大值的位置 for (int x = 0; x < height.length; x++) { if (height[x] > temp) { temp = height[x]; temp2 = x; } } // 进行累加 这里采用两头向中间逐级判断 //第一个for for (int i = 1; i <= temp2; i++) { if (height[i] > temp3) { temp3 = height[i]; } else { sum = sum + temp3 - height[i]; } } //第二个for for (int i = height.length - 1; i >= temp2; i--) { if (height[i] > temp4) { temp4 = height[i]; } else { sum = sum + temp4 - height[i]; } } return sum; } //空集合 else { return 0; } } //测试代码 public static void main(String[] args) { Main m = new Main(); int[] arr = { 0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1 }; System.out.println(m.trap(arr)); } } //////////////////////////////简化版 public class Solution { public int trap(int[] A) { int left = 0 , right = A.length-1; int sum = 0; int pre = 0; while(left < right){ sum += (Math.min(A[left], A[right])-pre) * (right-left-1); pre = Math.min(A[left],A[right]); if(A[left] > A[right]){ int temp = right-1; while(left < temp && A[temp] <= pre){sum-=A[temp];temp--;} if(left < temp) sum -= pre; right = temp; }else{ int temp = left+1; while(temp < right && A[temp] <= pre){sum-=A[temp];temp++;} if(temp < right) sum -= pre; left = temp; } } return sum; } }
最大值的位置只选一个(如果几个最大值一样的话 也只选其中一个)
其他解法:
1、填充集合为凸集 填充的单位
2、
class Solution { public int trap(int[] height) { if(height.length<3){ return 0; } return find(height,0,height.length-1); } public int find(int[] height,int start,int end){ if(end-start<2){//递归的终点 return 0; } int max=-1,tmp=-1,min_two=Math.min(height[start],height[end]),sum=0;; for(int i=start+1;i<end;i++){ //这一句写在哪里都行 sum=sum+(min_two-height[i]); if(height[i]>max){ max=height[i]; tmp=i; } } if(max<min_two){//上面的加法其实应该在这里,转移到上面和在这里其实都一样 //sum=sum+(min_two-height[i]); return sum; }else{//其实这里还可以优化一下当中间的max值等于start或者end的时候,当它等于start,那么直接计算即可,不用进行下一次递归,因为下一次递归会再扫描一遍 return find(height,start,tmp)+find(height,tmp,end); } } }
public int trap(int[] A) {
if (A==null) return 0;
Stack s = new Stack();
int i = 0, maxWater = 0, maxBotWater = 0;
while (i < A.length){
if (s.isEmpty() || A[i]<=A[s.peek()]){
s.push(i++);
}
else {
int bot = s.pop();
maxBotWater = s.isEmpty()? // empty means no il
0:(Math.min(A[s.peek()],A[i])-A[bot])*(i-s.peek()-1);
maxWater += maxBotWater;
}
}
return maxWater;
}
```