代码随想录day58【单调栈】每日温度 下一个更大元素 I

每日温度

力扣题目链接
利用单调栈:记录遍历过的元素
思路:
栈顶元素与当前遍历的元素对比:

  1. 当前遍历的元素>栈顶元素。记录结果,弹出栈顶元素,重复此过程。
    2.当前遍历的元素<=栈顶元素。将当前遍历的元素放入栈中。
var dailyTemperatures = function(temperatures) {
    let stack = [];
    let res = new Array(temperatures.length).fill(0);
    stack.push(0);

    for (let i = 0; i < temperatures.length; i++) {
        const top = stack[stack.length - 1];
        if (temperatures[top] >= temperatures[i]) {
        //记录结果
        stack.push(i);
        } else {
        while (
            stack.length >= 1 &&
            temperatures[stack[stack.length - 1]] < temperatures[i]
        ) {
            let key = stack.pop();
            res[key] = i - key;
        }
        stack.push(i);
        }
    }
    return res;
};

下一个更大元素 I

leecode题目
跟上题的区别:套了个壳子;
遍历nums2数组,利用单调栈,获得当前元素的下一个更大元素。通过map查看nums1是否有当前元素,若有,在nums1下标的相应位置更新最近最大的元素。

var nextGreaterElement = function(nums1, nums2) {
    let res=new Array(nums1.length).fill(-1)
    let stack=[]
    let map=new Map()
    for(let i in nums1){
        map.set(nums1[i],i)
    }

    stack.push(0)
    for(let i=1;i<nums2.length;i++){
        const top = stack[stack.length - 1];
        if (nums2[top] >= nums2[i]) {
        //记录结果
        stack.push(i);
        } else {
        while (
            stack.length >= 1 &&
            nums2[stack[stack.length - 1]] < nums2[i]
        ) {
            if(map.has(nums2[stack[stack.length-1]])){
                let key = stack.pop();
                let item=map.get(nums2[key])
                res[item] = nums2[i];
            }else {
                break;
                }
        }
        stack.push(i);
        }
    }
    return res
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容