leetcode739:每日温度

难度:中等
题目:请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

思路:第一种思路是暴力解法(不可取)。第二种思路:按照题目要求是,找出数组后面第一个比他大的数,并算出差值,放到res数组中保存,因此,我们可以使用单调栈来解决此问题。
可以维护一个存储下标的单调栈,从栈底到栈顶的下标对应的温度列表中的温度依次递减。如果一个下标在单调栈里,则表示尚未找到下一次温度更高的下标。

正向遍历温度列表。对于温度列表中的每个元素 T[i],如果栈为空,则直接将 i 进栈,如果栈不为空,则比较栈顶元素 prevIndex 对应的温度 T[prevIndex] 和当前温度 T[i],如果 T[i] > T[prevIndex],则将 prevIndex 移除,并将 prevIndex 对应的等待天数赋为 i - prevIndex,重复上述操作直到栈为空或者栈顶元素对应的温度小于等于当前温度,然后将 i 进栈。

class Solution {
    public int[] dailyTemperatures(int[] T) {
      int[] res = new int[T.length];
      Stack<Integer> stack = new Stack<Integer>();
      stack.push(0);
      for(int i=1;i<T.length;i++){
          //先压入第一个位置的,下标
          //看要压入的温度和栈顶温度进行对比,如果大,则弹出来,反之压入。
          //单调栈,从底到顶,依次减小。
          int tem = T[i]; 
          while(!stack.isEmpty() && tem> T[stack.peek()]){
              int index = stack.pop();
              res[index] = i - index;
          }
          stack.push(i);
      }
      return res;
    }
}

暴力解法(不推荐,仅作为验证):

class Solution {
    public int[] dailyTemperatures(int[] T) {
      int[] res = new int[T.length];
      for(int i=0;i<T.length-1;i++){
          for(int j=i+1;j<T.length;j++){
              if(T[j]>T[i]){
                  res[i] = j-i;
                  break;
              }
          }
      }
      res[T.length-1] = 0;
      return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值