- 2.23
- 这里使用的是维护最高墙,与5.柱状图的最大面积不同
class Solution {
public int trap(int[] height) {
int left = 0;
int right = height.length-1;
int maxL = 0;
int maxR = 0;
int ans=0;
while(left<right){
if(height[left]<height[right]){
if(height[left]<maxL){
ans+=maxL-height[left];
}else{
maxL = height[left];
}
left++;
}else{
if(height[right]<maxR){
ans+=maxR-height[right];
}else{
maxR = height[right];
}
right--;
}
}
return ans;
}
}-
2.6
- 先判断大边哪个是短板,判断当前的短板和之前的最大高度
- 如果如果高于最高高度,存不住水
- 如果低于最高高度,可以存水,总 ans+=当前水量
- 先判断大边哪个是短板,判断当前的短板和之前的最大高度
-
1.22
- 算是中等题
class Solution {
public int trap(int[] height) {
int left = 0;
int right = height.length - 1;
int leftMax = 0;
int rightMax = 0;
int ans = 0;
while (left < right) {
// 每次比较左右两根柱子,处理较矮的那一侧
// 为什么?因为水桶的容量取决于短板。
// 情况一:左边是短板
if (height[left] < height[right]) {
// 如果当前柱子比左边历史最高的还要高,那它自己就是新的墙,存不住水
if (height[left] >= leftMax) {
leftMax = height[left];
} else {
// 否则,它是低谷,能存水。存水量 = 左边墙 - 当前高度
// (不用管右边墙,因为进入这个 if 分支就意味着右边肯定有比左边高的)
ans += (leftMax - height[left]);
}
left++;
}
// 情况二:右边是短板(或者一样高)
else {
if (height[right] >= rightMax) {
rightMax = height[right];
} else {
ans += (rightMax - height[right]);
}
right--;
}
}
return ans;
}
}