日常刷题0x3之未出新手村

86 阅读2分钟

如果不小心网友来到了这里请网友自动飘走,浪费你们时间表示歉意。该系列博客的目的是:想作为自律工具和朋友一起每天刷几道题作为打卡督促的功能,没有什么可参考学习的东西,也不是刷博客量充大佬的目的

复习单调栈

题号: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
};