Day59题目
LeetCode503下一个更大元素
核心思想:和之前的下一个更高温度差不多,使用单调栈,只不过这个需要你循环查找,可以通过遍历两次数组实现
/**
* @param {number[]} nums
* @return {number[]}
*/
var nextGreaterElements = function(nums) {
var len = nums.length
var res = new Array(len).fill(-1)
var stack = []
// 这里遍历2*len次
for(let i = 0 ; i < 2* len ; i ++){
// 下面做判断都需要给i对len取余
while(stack.length > 0 && nums[stack[stack.length-1]] < nums[i%len]){
let index = stack.pop()
res[index] = nums[i%len]
}
stack.push(i%len)
}
return res;
};
LeetCode42接雨水
核心思想:高频题目,使用单调栈能够得到当前元素的后边第一个比他大的元素,和左边第一个比他大的元素(就是栈中的下一个),然后计算即可.使用单调栈是横向计算面积的
/**
* @param {number[]} height
* @return {number}
*/
var trap = function(height) {
var stack = []
var res = 0;
for(let i = 0 ; i < height.length ; i ++){
while(stack.length > 0 && height[stack[stack.length-1]] < height[i]){
let index = stack.pop();
if(stack.length === 0 ) break;
let h = Math.min(height[i],height[stack[stack.length-1]] ) - height[index];
let w = i - stack[stack.length-1] - 1;
let square = h*w;
res = res + square;
}
stack.push(i);
}
return res;
};