/**
*
* 给定 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
*
* 提示:
* n == height.length
* 0 <= n <= 3 * 104
* 0 <= height[i] <= 105
*
*
* 解题思路一:
*
* 1.单调递减栈
* 单调栈:栈里面存放的数据都是有序的,分为单调递增栈和单调递减栈两种
* 单调递增栈:大于等于栈顶元素 => 入栈
* 单调递减栈:小于等于栈顶元素 => 入栈
* 应用场景:
* 1. 每个元素右侧第一个大/小值
* 单调递增栈:找出数组中每个元素右侧第一个小数
* 单调递减栈:找出数组中每个元素右侧第一个大数
* 2. 视野问题
* 比如排队问题,只能看到比自己矮的,遇到一个高的就看不到后面的了
* 3. 接水问题
* 2. 接雨水:
* I.需要找到右侧第一个比当前元素大的元素,因为只有这样才会积水,所以用到单调递减栈
* II. 积水单位计算
* 积水可以看作是长方形的面积计算,一个单位的雨水,相当于1*1 = 1;
* 积水单位result计算:
* height:当前数组
* w: 积水宽,下标的差值
* h:积水高,值的差值
* l:栈顶元素(w的计算需要用到下标,所以我们的栈内元素都是对应的元素下标)
* i:当前元素下标
* top:出栈元素(下标)
* w = i-l-1
* h = Math.min(height[i],height[l]) - height[top]
* result = w*h;
*/
/**
* @param {number[]} height
* @return {number}
*/
var trap = function(height) {
const stack = [],n = height.length;
let result = 0;
for(var i=0;i<n;i++){
while(stack.length&&height[i]>height[stack[stack.length-1]]){
const top = stack.pop();
if(!stack.length){
break;
}
const l = stack[stack.length-1];
const w = i - l - 1;
const h = Math.min(height[i],height[l]) - height[top];
result += w*h;
}
stack.push(i);
}
return result;
};
const height = [4,2,0,3,2,5];
console.log(trap(height));
leetcode算法刷题记录之接雨水
最新推荐文章于 2024-04-19 18:22:27 发布