题目描述
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
输入:height = [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 个单位的雨水(蓝色部分表示雨水)。
解题思路
-
暴力法解决这个问题,首先从横向坐标来看某个位置能装的水water[i]=max(i位置左边的最高的柱子,i位置右边的最高柱子)-这个位置的
-
备忘录优化
-
双指针的解法
-
与滑动窗口方法的比较
-
什么是单调栈
AC 代码
- 暴力法代码
class Solution {
public int trap(int[] height) {
int sum=0;
for(int i=0;i<height.length;i++){
int leftMax=0;
int rightMax=0;
for(int j=i;j>=0;j--){
leftMax=Math.max(height[j],leftMax);
}
for(int j=i;j<height.length;j++){
rightMax=Math.max(height[j],rightMax);
}
sum+=Math.min(leftMax,rightMax)-height[i];
}
return sum;
}
}
- 备忘录代码
class Solution {
public int trap(int[] height) {
if(height.length==0){
return 0;
}
int sum=0;
int n=height.length;
int[] left=new int[n];
int[] right=new int[n];
left[0]=height[0];
right[n-1]=height[n-1];
for(int i=1;i<n;i++){
left[i]=Math.max(height[i],left[i-1]);
}
for(int i=n-2;i>=0;i--){
right[i]=Math.max(height[i],right[i+1]);
}
for(int i=1;i<n;i++){
sum+=Math.min(left[i],right[i])-height[i];
}
return sum;
}
}
- 双指针解法
class Solution {
public int trap(int[] height) {
int n=height.length;
if(n==0){
return 0;
}
int left=0;
int right=n-1;
int leftMax=height[0];
int rightMax=height[n-1];
int res=0;
while(left<right){
leftMax=Math.max(leftMax,height[left]);
rightMax=Math.max(rightMax,height[right]);
if(leftMax<rightMax){
res+=leftMax-height[left];
left++;
}else{
res+=rightMax-height[right];
right--;
}
}
return res;
}
总结
下次补上