classSolution{publicinttrap(int[] height){int n = height.length, res =0;int l =0, r = n -1;int l_max = height[0], r_max = height[n -1];while(l < r){if(height[l]< height[r]){
l_max =Math.max(l_max, height[l]);
res += l_max - height[l];
l++;}else{
r_max =Math.max(r_max, height[r]);
res += r_max - height[r];
r--;}}return res;}}
前缀和思想
classSolution{publicinttrap(int[] height){int n = height.length, res =0;int[] l_max =newint[n];// l_max[i] 表示 height[0] ... height[i] 的最大值int[] r_max =newint[n];// r_max[i] 表示 height[i] ... height[n-1] 的最大值
l_max[0]= height[0];for(int i =1; i < n; i++) l_max[i]=Math.max(l_max[i -1], height[i]);
r_max[n -1]= height[n -1];for(int i = n -2; i >=0; i--) r_max[i]=Math.max(r_max[i +1], height[i]);for(int i =1; i < n -1; i++){
res +=Math.min(l_max[i], r_max[i])- height[i];}return res;}}
单调栈
classSolution{publicinttrap(int[] height){Deque<Integer> stack =newArrayDeque<>();int res =0;for(int i =0; i < height.length; i++){while(!stack.isEmpty()&& height[i]> height[stack.peek()]){int pop = stack.pop();if(stack.isEmpty())break;int l = stack.peek();int r = i;int h =Math.min(height[l], height[r])- height[pop];
res +=(r - l -1)* h;}
stack.push(i);}return res;}}