42. 接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 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 个单位的雨水(蓝色部分表示雨水)。
示例 2:
输入:height = [4,2,0,3,2,5]
输出:9
class Solution {
public int trap(int[] nums) {
Stack<Integer> stack = new Stack();
int ans = 0;
int l = 0;
while(l < nums.length) {
while(!stack.empty() && nums[stack.peek()] < nums[l]){
int top = stack.pop();
if(stack.empty())
break;
int h = Math.min(nums[l],nums[stack.peek()])-nums[top];
int w = l - stack.peek()-1;
ans += (h*w);
}
stack.push(l++);
}
return ans;
}
}
双指针
注意上面的最后一段话
class Solution {
public int trap(int[] nums) {
int len = nums.length;
int left = 0;
int right = len-1;
int lm = 0;
int rm = 0;
int ans = 0;
// 最后一定指向的是最高的哪个,得到的数字一定是0,所以不需要=
while(left < right) {
if(nums[left] < nums[right]) {
lm = Math.max(lm,nums[left]);
ans += (lm-nums[left++]);
} else {
rm = Math.max(rm,nums[right]);
ans+=(rm-nums[right--]);
}
}
return ans;
}
}