当前位置: 首页 > article >正文

leetcode 739.每日温度

思路一:按部就班的去模拟单调栈

这样可能会造成时间超时,这里的做法差一个大大数据没有过。

分结果讨论,小于栈顶元素的时候怎么做,大于栈顶元素的时候怎么做;

其中当栈顶元素大于要遍历的元素的时候,我们就需要接着往后进行遍历,也就是在第一重循环的基础上再次遍历后面的数组有没有还小于的,直到我们找到再一次能够小于当前栈顶元素的值。

如果说后面没有小于栈顶元素的值了,我们就应该输入0.如果不是,我们就按照前面遍历的元素个数(包括这个小于栈顶元素)直接放入结果数组中就行了。不要忘记在遍历完之后需要出栈当前元素并更新入栈这个元素。

当我们的栈顶元素小于当前元素的时候,我们就直接进行出栈操作就行了。再次记录栈中的元素有多少个就行了,也就是距离天数。

最后汇总就行了。

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        Deque<Integer>stk=new LinkedList<>();
        int []res=new int[temperatures.length];
        stk.push(temperatures[0]);
        int cnt=0;
        int k=0;
        for(int i=1;i<temperatures.length;i++){
            if(temperatures[i]>stk.peek()){
            while(!stk.isEmpty()&&stk.peek()<temperatures[i]){
                cnt++;
                stk.pop();
            }
            res[k++]=cnt;
            cnt=0;
            stk.push(temperatures[i]);
            }
            else{
                int j=i;
                int counts=0;
                while(j<temperatures.length&&temperatures[j]<=stk.peek()){
                    counts++;
                    j++;
                }
                if(j==temperatures.length){
                    res[k++]=0;
                }
                else{
                    res[k++]=counts+1;
                    counts=0;

                }
                stk.pop();
                stk.push(temperatures[i]);
            }

        }
        return res;
    }
}

思路二:其实和上面的思路大体上相同,但是唯一不一样的地方就是,我们上一个思路中的做法栈中存储的是元素值本身,这个思路中使用了栈元素为下标的值。

同时作者忽略了单调栈的性质问题。其实上面说的那两种情况是没有必要去分类讨论的。

我们还是沿着刚刚的思路进行解法:

当我们碰到栈顶元素小于当前遍历元素的时候,我们就取出其中的坐标,然后跟当前的遍历的元素的下标相减,其实就是这个栈顶元素距离比它还高温度的天数了。我们把这两个操作合起来其实就是下面的答案了。

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        Deque<Integer>stk=new LinkedList<>();
        int []res=new int[temperatures.length];

        for(int i=0;i<temperatures.length;i++){
            while(!stk.isEmpty()&&temperatures[i]>temperatures[stk.peek()]){
                int pre=stk.pop();
                res[pre]=i-pre;
            }
            stk.push(i);
        }
        return res;
    }
}


http://www.kler.cn/a/349856.html

相关文章:

  • NLP模型大对比:Transformer > RNN > n-gram
  • 正则表达式入门
  • mac安装dockerdesktop优化
  • 分布式微服务系统架构第88集:kafka集群
  • 论文阅读(十四):贝叶斯网络在全基因组DNA甲基化研究中的应用
  • gesp(C++六级)(6)洛谷:P10109:[GESP202312 六级] 工作沟通
  • GS-LRM: Large Reconstruction Model for 3D Gaussian Splatting 论文解读
  • 软考《信息系统运行管理员》- 5.2 信息系统数据资源例行管理
  • MySQL初识
  • SQL 自学:事务处理的COMMIT 和 ROLLBACK 语句的运用
  • PG 17 增量备份功能介绍
  • 等保测评实战:SQL Server数据库的安全评估
  • 弧度和角度
  • ARINC 429总线协议
  • Redis知识应用索引指南
  • 【LeetCode】动态规划—95. 不同的二叉搜索树 II(附完整Python/C++代码)
  • 数据特征工程:离散趋势指标分析
  • RAG(检索增强生成)面经(1)
  • 前端开发设计模式——命令模式
  • QT元对象系统特性详细介绍(信号槽、类型信息、动态设置属性)(注释)
  • Git Commit 规范
  • DBdoctor推出无Agent轻量级纳管解决方案
  • 低代码策略量化平台更新|大模型agents生态的一些思考
  • STM32F407 定时器实例解析
  • 录屏工具TOP10,探索你最爱的免费屏幕录制软件!
  • 华为OD机试真题-最佳种树距离-2024年OD统一考试(E卷)