LeetCode 热题100-83-每日温度

方法一:
核心思想:暴力枚举
思路:双重for

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int len = temperatures.length;
        int[] res = new int[len];
        for(int i = 0; i < len; i++){
            for(int j = i + 1; j < len; j++){
                if(temperatures[j] > temperatures[i]){
                    res[i] = j - i;
                    break;
                }
            }
        }
        return res;
    }
}

方法二:
核心思想:单调栈
思路:
遍历整个数组,如果栈不空,且当前数字大于栈顶元素,那么如果直接入栈的话就不是 递减栈 ,所以需要取出栈顶元素,由于当前数字大于栈顶元素的数字,而且一定是第一个大于栈顶元素的数,直接求出下标差就是二者的距离。

继续看新的栈顶元素,直到当前数字小于等于栈顶元素停止,然后将数字入栈,这样就可以一直保持递减栈,且每个数字和第一个大于它的数的距离也可以算出来。
下边连接的大佬的动画完美演示了这个问题解决方式
https://leetcode.cn/problems/daily-temperatures/solution/leetcode-tu-jie-739mei-ri-wen-du-by-misterbooo/

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int len = temperatures.length;
        int[] res = new int[len];
        Deque<int[]> deque = new ArrayDeque<>();
        for(int i = 0; i < len; i++){
            if(deque.isEmpty()){
                deque.offerLast(new int[]{i, temperatures[i]});
            }else{
                int[] tem = deque.peekLast();
                while(tem[1] < temperatures[i]){
                    res[tem[0]] = i - tem[0];
                    deque.pollLast();
                    if(!deque.isEmpty()){
                        tem = deque.peekLast();
                    }else{
                        break;
                    }
                }
                deque.offerLast(new int[]{i, temperatures[i]});
            }
        }
        while(!deque.isEmpty()){
            int[] tem = deque.pollLast();
            res[tem[0]] = 0;
        }
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值