如果不小心网友来到了这里请网友自动飘走,浪费你们时间表示歉意。该系列博客的目的是:想作为自律工具和朋友一起每天刷几道题作为打卡督促的功能,没有什么可参考学习的东西,也不是刷博客量充大佬的目的
复习单调栈
题号:496
var nextGreaterElement = function (nums1, nums2) {
let record = new Map()
let stack = []
//把nums2中每个元素下一个比其大的值缓存下来
//然后遍历nums1找对应结果
nums2.forEach((item,idx) => {
if (idx == 0) {
stack.push(item)
} else {
//stack中有值就从后向前遍历该stack
//下面循环遍历的逻辑是stack必须有值且栈顶元素小于当前元素
while (stack.length != 0 && item > stack[stack.length - 1]) {
record.set(stack.pop(), item)
}
stack.push(item)
}
});
let result = []
nums1.forEach((item,idx) => {
if (record.has(item)) {
result.push(record.get(item))
} else {
result.push(-1)
}
});
return result
};
题号:503
//和上一题一样,不一样就是有个首尾相接,循环的时候扩充循环次数,填值
//的时候转为真实下标
var nextGreaterElements = function (nums) {
let stack = []
let result = new Array(nums.length).fill(-1)
for (let i = 0; i < nums.length * 2; i++) {
let curEle = nums[i % nums.length]
let topEle = nums[stack[stack.length - 1]]
while (curEle > topEle && stack.length != 0) {
result[stack.pop()] = curEle
topEle = nums[stack[stack.length - 1]]
}
stack.push(i%nums.length)
}
return result
};
题号:739
var dailyTemperatures = function (T) {
let result = new Array(T.length).fill(0)
let stack = []
T.forEach((item,idx) => {
while (stack.length != 0 && item > T[stack[stack.length - 1]]) {
let top = stack.pop()
result[top] = idx - top
}
stack.push(idx)
});
return result
};
题号:42
var trap = function (height) {
let stack = []//记录坐标
let blues = 0, black = 0
let result = 0
height.forEach((item,idx) => {
while (stack.length != 0 && item > height[stack[stack.length - 1]]) {
let h = height[stack.pop()]//池子底部高度
//准备匹配一个最近的池子左边界
if (stack.length == 0) {
//栈为空
//找不到符合题意的左边界
break
}
//能找到符合题意的左边界
let left = height[stack[stack.length - 1]]//一个左边界
//计算容量
//左右边界取最短当容器高度
let minH = Math.min(left, item)
//容器长
let dis = idx - stack[stack.length - 1] - 1
//容量累加
//-h的作用是减去池子低高度
result += dis*(minH - h)
}
stack.push(idx)
});
return result
};