【百日算法计划】:每日一题,见证成长(023)

news2024/11/23 21:35:26

题目

每日温度

请根据每日气温列表,重新生成一个列表,对应的位置的输出为:要想观测到更高的气温,至少需要等待的天数.如果气温在这之后都不再升高,则该位置用0代替.
例如,给定一个列表[73, 74, 65, 80,]
你的输出应该是[1, 2, 1, 0]

思路

首先,我们先来画图分析一下,毕竟图形是最直观的,温度列表数组如下图:

在这里插入图片描述

根据图形,先摒弃任何算法思想,直观的说一下,按照题目的要求,输出结果应该是啥

应该是:【1 天,2 天,1 天,0 天】

怎么算的呢?

其实很好算,但凡跟数组相关的,基本上都要利用数组下标,我们套一下

  • 1 天 = 74温度的下标 1 减去 73 温度的下标 0 = (1 - 0)
  • 2 天 = 80温度的下标 3 减去 74 温度的下标 1 = (3 - 1)
  • 1 天 = 80温度的下标 3 减去 65 温度的下标 2 = (3 - 2)
  • 0 天 = 80 温度是最后一个了,所以为 0

当计算当前温度需要等待的天数时,必须要等到下一轮或者后面好几轮才能得到结果。

比如:

  • 当计算 温度 73 需要等待的天数时,等到第 2 轮循环时,就可以得到了;
  • 当计算 温度 74 需要等待的天数时,等到第 4 轮循环时,才能得到;
  • 当计算 温度 65 需要等待的天数时,等到第 4 轮循环时,才能得到;

可以看到,第 4 轮循环,可以计算出前面温度 65 和温度 74 的结果。

也就是说,需要有一个数据结构来保存当前温度的数组下标,以便后续的计算。

再画图来推导下。

我们初始化一个数组来保存计算的结果,默认都是 0。

【第一轮循环】

在第一轮循环时,数据结构是空的,没有计算,所以只是把温度 73 的下标存入了数据结构中。
在这里插入图片描述

【第二轮循环】

在第二轮循环时,数据结构保存了 0(温度 73 的下标),且本轮的温度 74,大于数据结构中的下标所代表的温度值 73,所以计算 (1 - 0 = 1),将温度 73 的结果赋值为 1,同时将下标 0 删除,下标 1 存入数据结构。

在这里插入图片描述

【第三轮循环】

在第三轮循环时,虽然数据结构不为空(里面有个下标 1),但是本次的温度 65,小于下标 1 所代表的温度 74,所以不参与计算,仅把下标 2 存入数据结构。

在这里插入图片描述

【第四轮循环】

在第四轮循环时,此时数据结构中下标为 2 和 1,本轮是温度 80。

而温度 80 大于下标 2 代表的温度 65,参与计算(3 - 2 = 1),所以温度 65 的结果为 1,删除下标 2;

接着再判断温度 80 大于下标 1 代表的温度 74,参与计算(3 - 1 = 2),所以温度 74 的结果为 2,删除下标 1;

最后将下标 3 存入数据结构。

在这里插入图片描述

【总结】

从上面的推导过程,可以看出来,我们需要一个数据结构来保存温度下标,且按照先进后出的顺序,什么数据结构符合先进后出呢?

而且,只要这个下标参与了计算,就要把它从数据结构中弹出去。

代码实现

 public int[] dailyTemperatures(int[] tmp){
        Stack<Integer> stack = new Stack<>();
        int[] res = new int[tmp.length]; //结果数组
        for (int i = 0; i < tmp.length; i++) { //循环遍历气温
            //如果栈非空,且当前气温tmp[i] 大于 栈顶温度,则将结果存入res
            while (!stack.isEmpty() && tmp[i] > tmp[stack.peek()]){
                Integer pop = stack.pop(); //弹出来的是 气温在数组中的下标
                res[pop] = i - pop; //需要等待的天数为:当前下标-栈顶元素下标
            }
            stack.push(i); //气温入栈,注意存的是气温在数组中的下标
        }
        return res;
}

当然,也可以用暴力解法

public int[] dailyTemperatures2(int[] tmp){
        int[] res = new int[tmp.length];
        for (int i = 0; i < tmp.length; i++) {
            for (int j = i + 1; j < tmp.length; j++) {
                if (tmp[j] > tmp[i]){
                    res[i] = j - i;
                    break;
                }
            }
        }
        return res;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2239032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【在Linux世界中追寻伟大的One Piece】多路转接epoll

目录 1 -> I/O多路转接之poll 1.1 -> poll函数接口 1.2 -> poll的优点 1.3 -> poll的缺点 1.4 -> poll示例 1.4.1 -> 使用poll监控标准输入 2 -> I/O多路转接之epoll 2.1 -> 初识epoll 2.2 -> epoll的相关系统调用 2.2.1 -> epoll_cre…

推动AI云产业向深向实,云·AI·算力创新发展大会即将启幕

近年来&#xff0c;以AIGC为代表的新兴技术正加速演进&#xff0c;全球站在智能化变革的起点&#xff0c;人工智能与云计算的深度融合&#xff0c;也驱动云计算进入第三次发展浪潮&#xff0c;迎来前所未有的机遇。 伴随AI的快速发展&#xff0c;2024年《政府工作报告》明确提…

5G 现网信令参数学习(3) - RrcSetup(1)

目录 1. rlc-BearerToAddModList 1.1 rlc-Config 1.1.1 ul-AM-RLC 1.1.2 dl-AM-RLC 1.2 mac-LogicalChannelConfig 2. mac-CellGroupConfig 2.1 schedulingRequestConfig 2.2 bsr-Config 2.3 tag-Config 2.4 phr-Config 2.5 skipUplinkTxDynamic 3. physicalCellG…

【MyBatis源码】深入分析TypeHandler原理和源码

文章目录 原始 JDBC 存在的问题自定义 TypeHandler 实现TypeHandler详解BaseTypeHandler类TypeReference类型参考器43个类型处理器类型注册表&#xff1a;3个注解类枚举类 原始 JDBC 存在的问题 MyBatis 之所以设计了 TypeHandler&#xff08;类型处理器&#xff09;&#xff…

运营篇|公众号小程序如何实现流量主变现

公众号小程序如何实现流量主变现&#xff1f;三步走&#xff1a; ①开通流量主&#xff1b; ②接入广告&#xff1b; ③裂变传播&#xff1b; 一、小程序开通流量主的运营要求 微信小程序开通流量主的前提条件主要包括以下几个方面&#xff1a; 日活跃用户&#xff08;DAU…

丹摩征文活动 | 轻松上手图像生成:FLUX.1遇上ComfyUI,让复杂变简单!

一、背景 FLUX.1是由黑森林实验室推出的一款前沿图像生成模型&#xff0c;针对不同用户需求&#xff0c;提供了三种不同版本。 FLUX.1-pro是专为企业设计的闭源版本&#xff0c;拥有无与伦比的性能和生成能力。其在识别提示词、提升视觉质量、细节表现及输出多样性方面都有出…

PyTorch核心概念:从梯度、计算图到连续性的全面解析(三)

文章目录 Contiguous vs Non-Contiguous TensorTensor and ViewStrides非连续数据结构&#xff1a;Transpose( )在 PyTorch 中检查Contiguous and Non-Contiguous将不连续张量&#xff08;或视图&#xff09;转换为连续张量view() 和 reshape() 之间的区别总结 参考文献 Contig…

「IDE」集成开发环境专栏目录大纲

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「IDE」集成开发环境&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定…

Kafka经典面试题

1、kafka消息发送的流程&#xff1f; producer发送过程中启动两个线程 一个main线程 一个sender线程&#xff0c;在main线程中先创建一个双端队列&#xff08;RecordAccumlator、producerbatch&#xff09;&#xff0c;main将我们需要发送的东西经过拦截器&#xff0c;序列化&a…

手把手写深度学习(29):将DDP训练代码改成DeepSpeed

手把手写深度学习(0)&#xff1a;专栏文章导航 前言&#xff1a;deepspeed已经成为了大模型时代训练模型的常规武器&#xff0c;这篇博客以一个基于DDP的 Stable Diffusion模型训练为例&#xff0c;讲解如何从将DDP训练代码改成DeepSpeed。 目录 构建optimizer 构建scheduler…

信息收集系列(二):ASN分析及域名收集

内容预览 ≧∀≦ゞ 信息收集系列&#xff08;二&#xff09;&#xff1a;ASN分析及域名收集前言一、ASN 分析1. 获取 ASN 码2. 使用 ASNMap 获取 IP 范围3. 将 IP 范围转化为 IP 列表 二、关联域名收集1. 顶级域&#xff08;TLD&#xff09;收集测试方法 2. 根域名收集常用方法…

《数学分析》中不等式及补充

说明&#xff1a;此文章用于本人复习巩固&#xff0c;如果也能帮到大家那就更加有意义了。 注&#xff1a;1&#xff09;《数学分析》中的不等式及不等式的补充

HTML之图片和超链接的学习记录

图片 在HTML中&#xff0c;我们可以使用img标签来显示一张图片。对于img标签&#xff0c;我们只需要掌握它的三个属性&#xff1a;src、alt和title。 <img src"" alt"" title"" /> src用于指定图片所在的路径&#xff0c;这个路径可以是…

unity显示获取 年月日周几【日期】

unity显示获取 年月日周几【日期】 public void ShowDate(Text txt){//txt.text DateTime now DateTime.Now; // 获取当前时间int year now.Year; // 获取年份int month now.Month; // 获取月份&#xff08;1-12&#xff09;int day now.Day; // 获取天数&#xff08;1-31&…

【区块链】深入理解智能合约 ABI

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 深入理解智能合约 ABI&#xff08;应用程序二进制接口&#xff09;一、ABI 基础…

鸿蒙ZRouter动态路由框架—生命周期管理能力

文章目录 基本使用(单个页面生命周期&#xff09;页面的全局生命周期监听工作流程图源码 ZRouter从1.1.0版本开始支持生命周期函数管理能力&#xff0c;主要有以下特点&#xff1a; 不影响你原有的生命周期业务逻辑&#xff0c;对NavDestination页面保持着零侵入性&#xff0c;…

代码随想录算法训练营第十九天|理论基础、77. 组合、216.组合总和III、17.电话号码的字母组合

理论基础 文章链接&#xff1a;代码随想录 视频讲解&#xff1a;带你学透回溯算法&#xff08;理论篇&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili关于回溯算法&#xff0c;我公众号里已经讲完了&#xff0c;并且将回溯算法专题整理成一本PDF&#xff0c;该PDF共…

uniapp的基本使用(easycom规范和条件编译)和uview组件的安装和使用

文章目录 1、uniapp1.uview组件安装2.uview-plus组件安装 2、条件编译3、easycom规范1.组件路径符合规范2.自定义easycom配置的示例 总结 1、uniapp UniApp的UI组件库&#xff0c;如TMUI、uViewUI、FirstUI、TuniaoUI、ThorUI等&#xff0c;这些组件库适用于Vue3和TypeScript&…

深入探索GDB调试技巧及其底层实现原理

本文分为两个大模块&#xff0c;第一部分记录下本人常用到的GDB的调试方法和技巧&#xff0c;第二部分则尝试分析GDB调试的底层原理。 一、GDB调试 要让程序能被调试&#xff0c;首先得编译成debug版本&#xff0c;当然release版本的也能通过导入符号表来实现调试&#xff0c…

Kubernetes的基本概念

Kubernetes是谷歌以Borg为前身,基于谷歌15年生产环境经验的基础上开源的一个项目,Kubernetes致力于提供跨主机集群的自动部署、扩展、高可用以及运行应用程序容器的平台。 一、资源对象概述 Kubernetes中的基本概念和术语大多是围绕资源对象(Resource Object)来说的,而资…