首页 > 其他分享 >力扣-739. 每日温度

力扣-739. 每日温度

时间:2024-05-17 22:31:24浏览次数:23  
标签:遍历 int 每日 力扣 vector temperatures 739 复杂度 温度

1.题目

题目地址(739. 每日温度 - 力扣(LeetCode))

https://leetcode.cn/problems/daily-temperatures/

题目描述

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

 

示例 1:

输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]

示例 2:

输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]

示例 3:

输入: temperatures = [30,60,90]
输出: [1,1,0]

 

提示:

  • 1 <= temperatures.length <= 105
  • 30 <= temperatures[i] <= 100

2.题解

2.0 暴力枚举()

思路

两重for循环暴力枚举即可, 这里由于默认数组值为0,所以不单独讨论不存在更大温度的情况

代码

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int n = temperatures.size();
        vector<int> ans(n);
        for(int i = 0; i < n; i++){
            for(int j = i + 1; j < n; j++){
                if(temperatures[i] < temperatures[j]){{
                    ans[i] = j - i;
                    break;
                }}
            }
        }
        return ans;
    }
};

复杂度分析

令 n 为数组长度。

  • 时间复杂度:\(O(n^2)\)
  • 空间复杂度:\(O(1)\)

2.1 暴力枚举(打表,利用变量范围有限)

思路

由于温度范围在 [30,100] 之内,因此可以维护一个数组 next 记录每个温度第一次出现的下标。数组 next 中的元素初始化为无穷大,在遍历温度列表的过程中更新 next 的值。
这里遍历大于当前温度的所有可能值,如果在next数组中出现索引值,赋值给warmerIndex,并且使用min不断寻找,就可以找到最小索引

这里必须是反向遍历该数组,才能保证是第一次出现的下标,否则正向遍历可能是之后出现的覆盖了第一次出现的下标

代码

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int n = temperatures.size();
        vector<int> ans(n), next(101, INT_MAX);
        for (int i = n - 1; i >= 0; --i) {
            int warmerIndex = INT_MAX;
            for (int t = temperatures[i] + 1; t <= 100; ++t) {
                warmerIndex = min(warmerIndex, next[t]);
            }
            if (warmerIndex != INT_MAX) {
                ans[i] = warmerIndex - i;
            }
            next[temperatures[i]] = i;
        }
        return ans;
    }
};

复杂度分析

  • 时间复杂度:\(O(nm)\),其中\(n\)是温度列表的长度,\(m\)是数组 next 的长度,在本题中温度不超过 100,所以\(m\)的值为 100。反向遍历温度列表一遍,对于温度列表中的每个值,都要遍历数组 next 一遍。

  • 空间复杂度:\(O(m)\),其中\(m\)是数组 next 的长度。除了返回值以外,需要维护长度为\(m\)的数组 next 记录每个温度第一次出现的下标位置

2.2 单调栈(正常单调栈思路:求点左侧更小/大,顺序遍历; 求点右侧最小/大,逆序遍历)

思路

这里实际上就是求最近更大值的问题,使用单调栈的思路(相当于将2.0中j遍历右半部分那部分替换为用栈存储更大值信息,并进行了筛选(不可能再为更大值的全部弹出,保证每个元素只入栈出栈一次!!!))
由于是向点的右侧寻找更大值,我们选择逆序遍历,这样我们能事先知道右侧的情况,并根据右侧生成的单调栈判断距离当前点最近的更大值
我们选择记录索引的方式,相差天数使用索引相减即可

备注:这里在求天数的时候,我最开始有一个奇思妙想,记录每次while循环的出栈次数就是相差天数,但是这很显然是错误的,因为出栈次数中有部分元素不是在当前点的情况下出栈的,这样就会少算这部分元素

代码

  • 语言支持:C++

C++ Code:


class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int n = temperatures.size();
        stack<int> stk;
        vector<int> ans(n);
        
        // 生成单调栈
        for(int i = n - 1; i >= 0; i--){
            int temp = temperatures[i]; 
            while(!stk.empty() && temp >= temperatures[stk.top()]){
                stk.pop();
            }
            ans[i] = stk.empty()?0: (stk.top() - i);
            stk.push(i);
        }

        return ans;
    }
};

复杂度分析

  • 时间复杂度:\(O(n)\),其中\(n\)是温度列表的长度。逆向遍历温度列表一遍,对于温度列表中的每个下标,最多有一次进栈和出栈的操作。

  • 空间复杂度:\(O(n)\)。其中\(n\)是温度列表的长度。需要维护一个单调栈存储温度列表中的下标。

2.3单调栈(求点右侧最小/大,正序遍历)

思路

这里相当于逆转思路,在2.2中我们将当前元素作为操作元素,生成了其后面的单调栈,便于比较操作
这里我们将单调栈中的元素作为操作元素,正序遍历,一旦在之后的元素出现了大于栈顶元素的值,意味着:
1.出现了栈顶元素的右侧最近更大值
2.该元素之后不可能再被作为右侧最近更大值的候选项(有更符合的值:当前项)

代码

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int n = temperatures.size();
        vector<int> ans(n);
        stack<int> s;
        for (int i = 0; i < n; ++i) {
            // 如果当前值大于之前入栈的栈顶值,就出栈栈顶元素,并更新栈顶元素的目标值
            while (!s.empty() && temperatures[i] > temperatures[s.top()]) {
                int previousIndex = s.top();
                ans[previousIndex] = i - previousIndex;
                s.pop();
            }
            s.push(i);
        }
        return ans;
    }
};

复杂度分析

  • 时间复杂度:\(O(n)\),其中\(n\)是温度列表的长度。正向遍历温度列表一遍,对于温度列表中的每个下标,最多有一次进栈和出栈的操作。

  • 空间复杂度:\(O(n)\)。其中\(n\)是温度列表的长度。需要维护一个单调栈存储温度列表中的下标。

标签:遍历,int,每日,力扣,vector,temperatures,739,复杂度,温度
From: https://www.cnblogs.com/trmbh12/p/18198797

相关文章

  • 力扣-84. 柱状图中最大的矩形
    1.题目介绍题目地址(84.柱状图中最大的矩形-力扣(LeetCode))https://leetcode.cn/problems/largest-rectangle-in-histogram/题目描述给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1。求在该柱状图中,能够勾勒出来的矩形的最大面积。 示......
  • 力扣-96. 下一个更大元素 I
    1.题目题目地址(496.下一个更大元素I-力扣(LeetCode))https://leetcode.cn/problems/next-greater-element-i/题目描述nums1 中数字 x 的下一个更大元素是指 x 在 nums2中对应位置右侧的第一个比 x 大的元素。给你两个没有重复元素的数组 nums1和 nums......
  • 图寻每日挑战记录
    图寻每日挑战记录有时间就打打放松一下2024/5/16有时间打了一下1/5看到了绿色的环境,全白的车牌和马路线,初步判断是东欧,并觉得是俄罗斯,但是看到右行感觉奇怪,最后还是点了俄罗斯菜死了,乌克兰不知道是全白牌2/5看到了右行,然后车牌很奇怪,不是欧盟的,是白色的打码,中间三个黑色......
  • 架构每日一学 6:作为架构师,你必须学会寻找商业模式
    本文首发于公众平台:腐烂的橘子在前面的文章中,我们已经讲了架构师的两条生存法则,第一条是有且仅有一个目标,感兴趣的可以看一下原文:架构每日一学2:架构师六个生存法则之一:架构必须有且仅有一个目标(一)第二条生存法则是架构活动要顺应人性:架构每日一学5:拼多多如何通过洞察人性......
  • 力扣224.基本计算器(困难)
    题目​ 给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值。解题思路我们可以使用两个栈nums和ops。nums:存放所有的数字ops:存放所有的数字以外的操作,+/-也看做是一种操作然后从前往后做,对遍历到的字符做分情况讨论:空格:跳过(:直接加入ops......
  • 架构每日一学 4:成为首席架构师,你必须学会顺应人性
    架构师生存法则之二:架构活动需要顺应人性 https://www.cnblogs.com/rottenorange-cn/p/18186331程序员入行的第一天起就进入了一个机器的世界。在别人的眼中,程序员平时很少说话,更多的时间在和电脑打交道。程序员工作时间久了大脑会被格式化,就像一个一个方格。它有一定好处,就......
  • 力扣第130场双周赛
    判断矩阵是否满足条件给定二维矩阵,判断所有格子是否满足如下条件:如果它下面的格子存在,那么它需要等于它下面的格子如果它右边的格子存在,那么它需要不等于它右边的格子遍历二维矩阵,简单模拟即可。classSolution{public:boolsatisfiesConditions(vector<vector<in......
  • 力扣1553 2024.5.13
    原题网址:此处为链接个人难度评价:1700分析:虽然不知道为什么贪心不对,但总之贪心不对。数据如此大也难以DP,那么只有搜索了。显然有一眼可得的搜索记忆化:记忆当只剩下k个果时还需要几天。值得一提的是,本代码实际上可能并不是一个正解代码,其可能无法在整数域上保证所有答案正确,但在......
  • 架构每日一学 5:拼多多如何通过洞察人性脱颖而出?
    本文首发于公众平台:腐烂的橘子上一篇文章,我们讲到架构活动一定要顺应人性,今天我们就来聊一聊,拼多多如何通过洞察人性在电商行业脱颖而出。拼多多从诞生到现在,可以说是颠覆了整个互联网的认知。2015年,阿里巴巴几乎垄断了互联网电商的全部流量,淘宝有21亿商品可供用户选择,配......
  • 架构每日一学 4:成为首席架构师,你必须学会顺应人性
    本文首发于公众平台:腐烂的橘子架构师生存法则之二:架构活动需要顺应人性程序员入行的第一天起就进入了一个机器的世界。在别人的眼中,程序员平时很少说话,更多的时间在和电脑打交道。程序员工作时间久了大脑会被格式化,就像一个一个方格。它有一定好处,就是你在写代码的时候更容易......