这个题如何用栈解呢?

本文探讨了一个经典问题,如何使用栈的数据结构实现根据每日气温列表计算后续气温升高所需天数。通过栈操作简化查找过程,展示了栈在解决此类问题中的高效应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每日温度

今天又给大家挑了一道十分经典的题目,也是一道面试常考题目,所以大家记得打卡啊,我们先来看一下题目描述,题目很容易理解,而且用暴力法也很容易实现,因为这个题目出现了我们的栈的模块,大家能不能用栈实现呢?

为保证严谨性,文章中的所有代码均经过测试,大家可以放心食用。

题目描述:

请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。

示例1:

输入:temperatures = [73, 74, 75, 71, 69, 72, 76, 73]

输出:arr =   [1, 1, 4, 2, 1, 1, 0, 0]

示例2:

输入:temperatures = [30,30,31,45,31,34,56]

输出:arr =   [2,1,1,3,1,1,0]

题目解析:题目是不是很容易理解啊,就是为了我们找到当前值的后面比其大第一个的数,他俩之间相差几位。比如示例1中,75的下标为2,75的后面比它大的值为76下标为6,6-2=4所以arr[2]=4;

暴力解:

j 指针每次都初始化在i指针后一位,然后遍历数组,找到比其大的值就赋值给arr数组,直至i指针遍历结束。


题目代码:

class Solution {
    public int[] dailyTemperatures(int[] T) {
    
        //创建输出数组
        
        int[] arr = new int[T.length];
        
        //遍历输入数组
        
        for (int i = 0; i < T.length; i++) {   
        
            //定义j指针
            
            int j = i + 1;
            
            //找到比其大的值
            
            while (j < T.length && T[i] >= T[j]) {   
                j++;  
            }
            
            //两种情况的赋值,一种是找到了比其大的值,一种是没找到赋值为0
            
            if(j < T.length && T[i] < T[j]){
                arr[i] = j-i;
            }else{
                arr[i] = 0;
            }         
        }
        return arr;
    }
}

栈:

下面我们来看一下如何用栈完成这个题目,我们先看动图了解下思路。

注:栈中的括号内的值,代表索引对应的元素,我们的入栈的为索引值,为了便于理解将其对应的值写在了括号中

解题思路:我们遍历数组时,会先跟栈顶索引对应的元素进行对比,如果小于该值则入栈,如果大于则将栈顶元素出栈,新的元素入栈。例如栈顶为69,新的元素为72,则69出栈,72入栈。并赋值给arr,69的索引为4,72的索引为5,则arr[4] = 5-4=1;

题目代码:

class Solution {
    public int[] dailyTemperatures(int[] T) {     
        //得到数组长度
        int len = T.length;
        //创建一个栈,用于存T的索引  
        Stack<Integer> stack = new Stack<>();
        //返回的数组
        int[] arr = new int[len];
        //遍历数组  
        for(int i = 0; i < len; i++){        
            //当指针指向的当前值大于栈顶元素对应值时则队数组赋值。            
            while(!stack.isEmpty() && T[i] > T[stack.peek()]){
                  arr[stack.peek()] = i - stack.pop();
            }
            //栈为空时和当前值小于等于栈顶元素时入栈            
            stack.push(i);
        }
        return arr;

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值