LeetCode 739 Daily Temperatures

文章目录

题目

给一个大小为n的数组T,要求对i0-n,计算出从i + 1开始的第一个大于T[i]的数的位置j,并将j-i的值记录下来。例如对于数组:[73, 74, 75, 71, 69, 72, 76, 73],输出数组为:1, 1, 4, 2, 1, 1, 0, 0
:数组T不为空,且最多包含30000个元素,每个元素的取值范围为[30, 100]

思路

因为是找i之后的数中第一个大于T[i]的,因此可以从后往前进行计算。

  1. 由于每个元素取值范围较小,所以通过下标计算每个元素出现的最小位置,之后再遍历整个值范围得到最终结果。例如对于71, 69, 72, 76, 73来说,从后往前:

    i = 4: 遍历74-100,无更大元素出现,res[4] = 0, 
        之后记录 mpos[73] = min(mpos[73], 4)
    i = 3: 遍历77-100,无更大元素出现,res[3] = 0
        之后记录 mpos[76] = min(mpos[76], 3)
    i = 2: 遍历73-100,找到73 76两个, res[2] = min(mpos[73], mpos[76])
        之后记录 mpos[72] = min(mpos[72], 2)
    ...
    
  2. 不妨考虑T = [40, 37, 35, 34, 39, 34, 35],从后往前遍历,到达T[4] = 39时,由于39此时是最大的,因此其后的34, 35其实都不需要再考虑了。进一步:

    i = 4, 40 37 35 34 39 34 35
    i = 3, 40 37 35 34 39 34 35
    i = 1, 40 37 35 34 39 34 35
    i = 0, 40 37 35 34 39 34 35

    即因为我们需要的是更靠前且更大的数,所以当遇到更大的数时即可将后面较小的数给无效化 。具体实现可以使用,从后往前不断将值入栈,当遇到更大的值时将栈顶所有小于其的数出栈即可。

代码

  1. 值当索引遍历
     #define maxn 102
     #define maxval 30001
     class Solution {
     private:
         int min_pos[maxn];
     public:
         vector<int> dailyTemperatures2(vector<int> &T) {
             const int n = T.size();
             vector<int> ret(T.size(), 0);
             if (n <= 1)
                 return ret;
             for (int i = 0; i < maxn; i++) {
                 min_pos[i] = maxval;
             }
             min_pos[T[n - 1]] = n - 1;
             for (int i = n - 2; i >= 0; i--) {
                 int tmpVal = T[i], tmpMin = maxval;
                 for (int j = tmpVal + 1; j < maxn; j++) {
                     tmpMin = min(tmpMin, min_pos[j]);
                 }
                 if (tmpMin != maxval)
                     ret[i] = tmpMin - i;
                 min_pos[tmpVal] = min(i, min_pos[tmpVal]);
             }
             return ret;
         }
     }
    
  2. 使用栈
     class Solution {
     public:
         vector<int> dailyTemperatures(vector<int> &T) {
             vector<int> ret(T.size(), 0);
             stack<int> sta;
             for (int i = T.size() - 1; i >= 0; i--) {
                 int tmpval = T[i];
                 while (!sta.empty() && T[sta.top()] <= T[i]) {
                     sta.pop();
                 }
                 if (!sta.empty())
                     ret[i] = sta.top() - i;
                 sta.push(i);
             }
             return ret;
         }
     };
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值