【leetcodehot100】day3-leetcode739-每日温度

day3-leetcode739-每日温度

题目描述:
在这里插入图片描述
思路
根据标签提示中的“栈”可以想到使用栈来解决这道题

  1. 同时看到temperatures数组长度很长,但是温度范围只有30-100,故可以考虑使用温度这个维度来进行设计
  2. 本质是比较温度的大小,想到使用一个递增/递减的栈就可以解决比较大小的问题
  3. 根据题目要求要找到比当前温度更高的天数,假设栈顶是当前温度,那么新进来的应该是比它小的,即栈顶永远是栈中温度最小的元素,那么如果新来的第i天温度比当前栈顶温度大,则认为他是比栈顶天数温度大且最近的一天,同时由于栈是一个递减栈,所以该天出栈后下一个栈顶可以和当前第i天温度继续比较,第i天更大则栈顶出栈,第i天更小则进栈,直至第i天进栈
  4. 要输出天数差值,所以栈中以temperatures数组的下标为元素

代码如下:

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int len = temperatures.length;
        Deque<Integer> st = new ArrayDeque<>();
        int [] answer = new int [len];
        for(int i=0;i<len;i++){
            while(!st.isEmpty()&&temperatures[i]>temperatures[st.peek()]){
                int now = st.pop();
                answer[now]=i-now;
            }
            st.push(i);
        }
        return answer;
    }
}

补充:
刚开始使用Stack对象创建栈,ac后发现效率远不如Deque这个对象,查阅资料后学习到了Stack属于JAVA的遗留类(legacy class),它的所有方法是同步的(进程安全的),但是会大幅降低性能
Deque本质是一个双端队列,支持从两端插入和删除元素(既可栈也可队列),用作栈时,效率更高,无线程安全开销
这是作为栈时他们和新方法的对比,主要时判断是否为空时方法不一样:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值