首页 > 其他分享 >Leetcode面试经典150题-739.每日温度

Leetcode面试经典150题-739.每日温度

时间:2024-09-15 11:20:03浏览次数:10  
标签:150 minStack popIndex int length temperatures 栈里 739 Leetcode

应读者私信要求,本题协商题目的具体内容

给定一个整数数组 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]

其他的就不多说了,上代码,看不懂的请留言或者私信,收到第一时间解答

class Solution {
    /**题目是再简单不过的单调栈问题,而且和我们以前单调栈不同的是,这个只是求后面的
    所以我们只需要定义一位数组就可以了,其他的边写边解释吧
    这里要特别注意的是题目求的是下一个更高温出现在几天后,而不是出现在第几天,这明显就是一个陷阱
    解题的时候千万注意 */
    public int[] dailyTemperatures2(int[] temperatures) {
        /**如果就给了一天,那没有后面的天了,按题目要求返回0 */
        if(temperatures.length == 1) {
            return new int[]{0};
        }
        /**定义结果数组*/
        int[] ans = new int[temperatures.length];
        /**定义单调栈,栈里放的元素从底到顶越来越小,如果出现更大的就把栈里比它小的全部弹出
        注意栈里放的是下标*/
        Stack<Integer> minStack = new Stack<>();
        minStack.push(0);
        for(int i = 0; i < temperatures.length; i++) {
            while(!minStack.isEmpty() && temperatures[minStack.peek()] < temperatures[i]) {
                /**比它小的都弹出*/
                int popIndex = minStack.pop();
                /**是因为i的出现导致了popIndex位置的数弹出,所以i是右边第一个比它大的 */
                ans[popIndex] = i - popIndex;
            }
            minStack.push(i);
            /**次数比之前单调栈的问题简答的是不用再把栈里的弹空算每个对应的值,因为剩下的都是大的,右边没有比他大的
            题目规定没有比他大的就写0,所以这里直接省略了 */
        }
        return ans;
    }

    /**题目有点恶心,竟然只战胜40%的人,但是时间复杂度确实是O(n),我这里突然纠结了一下
    决定给他改了,不就是因为用了系统的栈吗我不用还不行吗 */
    public int[] dailyTemperatures(int[] temperatures) {
        /**如果就给了一天,那没有后面的天了,按题目要求返回0 */
        if(temperatures.length == 1) {
            return new int[]{0};
        }
        /**定义结果数组*/
        int[] ans = new int[temperatures.length];
        /**定义单调栈,栈里放的元素从底到顶越来越小,如果出现更大的就把栈里比它小的全部弹出
        注意栈里放的是下标*/
        int[] minStack = new int[temperatures.length];
        minStack[0] = 0;
        /**栈目前的有效长度 */
        int validLen = 1;
        for(int i = 0; i < temperatures.length; i++) {
            while(validLen != 0 && temperatures[minStack[validLen - 1]] < temperatures[i]) {
                /**比它小的都弹出*/
                int popIndex = minStack[--validLen];
                /**是因为i的出现导致了popIndex位置的数弹出,所以i是右边第一个比它大的 */
                ans[popIndex] = i - popIndex;
            }
            minStack[validLen++] = i;
            /**次数比之前单调栈的问题简答的是不用再把栈里的弹空算每个对应的值,因为剩下的都是大的,右边没有比他大的
            题目规定没有比他大的就写0,所以这里直接省略了 */
        }
        return ans;
    }
}

本来就是最优解了,但是竟然让我超过了40%的人,今天我是看不多去了,直接在常数时间了又改进了一把,也许仅此一次,下次不搞了,毕竟我们做算法看时间复杂度和空间复杂度,不看常数时间,非重点公司,我都懒得给他们改 

这结果面试官大哥满意吗。。。 

标签:150,minStack,popIndex,int,length,temperatures,栈里,739,Leetcode
From: https://blog.csdn.net/Chang_Yafei/article/details/142281627

相关文章

  • 【JavaScript】LeetCode:707设计链表
    文章目录题目内容题目分析(1)获取第n个节点的值(2)头部插入节点(3)尾部插入节点(4)第n个节点前插入节点(5)删除第n个节点完整代码题目内容题目分析添加哨兵节点dummy。在第n个节点前插入节点时,应该找到第n-1个节点(即前一个节点),才能完成插入操作。在删除第n......
  • 「数学::质数」埃氏筛|欧拉筛(埃拉托斯特尼筛法|线性筛法)/ LeetCode 204(C++)
    目录概述1.埃氏筛思路复杂度Code2.欧拉筛(线性筛)思路复杂度Code总结概述上一节我们介绍了对判断一个数是否为质数的方法:「数学::质数」试除法/LuoguP5736(C++)那如果我们期望输出一个范围内的所有质数,使用试除法的时间复杂度是n√n,怎么办呢?LeetCode204:给定整......
  • dfs 验证搜索二叉树——leetcode98
    代码来自leetcode官方一开始我自己写这个代码时只注意当前节点是否会存在空指针,并没有注意到他的孩子节点也有可能为空,绕了我好久。。。。。。/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;......
  • LEETCODE 1709 两个日期的最大空档期
      表: UserVisits+-------------+------+|ColumnName|Type|+-------------+------+|user_id|int||visit_date|date|+-------------+------+该表没有主键,它可能有重复的行该表包含用户访问某特定零售商的日期日志。 假设今天的日期是 '2021-1-1......
  • LeetCode189. 轮转数组(2024秋季每日一题 16)
    给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。示例1:输入:nums=[1,2,3,4,5,6,7],k=3输出:[5,6,7,1,2,3,4]解释:向右轮转1步:[7,1,2,3,4,5,6]向右轮转2步:[6,7,1,2,3,4,5]向右轮转3步:[5,6,7,1,2,3,4]示例2:输入:nums=[-1,-100,3......
  • LeetCode238. 除自身以外数组的乘积(2024秋季每日一题 17)
    给你一个整数数组nums,返回数组answer,其中answer[i]等于nums中除nums[i]之外其余各元素的乘积。题目数据保证数组nums之中任意元素的全部前缀元素和后缀的乘积都在32位整数范围内。请不要使用除法,且在示例1:输入:nums=[1,2,3,4]输出:[24,12,8,6]示例2:输......
  • LeetCode53. 最大子数组和(2024秋季每日一题 15)
    给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组:是数组中的一个连续部分。示例1:输入:nums=[-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组[4,-1,2,1]的和最大,为6。示例2:输入:nums=[1]输出:1示例3:输入:nums=[5,4,-1......
  • LeetCode56. 合并区间(2024秋季每日一题 16)
    以数组intervals表示若干个区间的集合,其中单个区间为intervals[i]=[starti,endi]。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例1:输入:intervals=[[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间[1,3]......
  • LeetCode76. 最小覆盖子串(2024秋季每日一题 14)
    给你一个字符串s、一个字符串t。返回s中涵盖t所有字符的最小子串。如果s中不存在涵盖t所有字符的子串,则返回空字符串“”。注意:对于t中重复字符,我们寻找的子字符串中该字符数量必须不少于t中该字符数量。如果s中存在这样的子串,我们保证它是唯一的答案。示例1......
  • LeetCode239. 滑动窗口最大值(2024秋季每日一题 13)
    给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例1:输入:nums=[1,3,-1,-3,5,3,6,7],k=3输出:[3,3,5,5,6,7]解释:示例2:输入:nums=[1],k......