代码随想录算法训练营第六十一天| 739. 每日温度,496.下一个更大元素 I

 题目与题解

739. 每日温度

题目链接:739. 每日温度

代码随想录题解:739. 每日温度

视频讲解:单调栈,你该了解的,这里都讲了!LeetCode:739.每日温度_哔哩哔哩_bilibili

解题思路:

        最好想的就是暴力法,遍历数组中的每一个温度,并在此基础上,遍历当前元素后的每一个元素,直到找到比当前元素大的第一个元素,记录在结果中。但是这个方法超时了。

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

看完代码随想录之后的想法 

        单调栈,一种神奇的数据结构,一般针对一维数组使用。

        它的基础逻辑是:栈内的元素存放顺序是单调的,其弹出元素也必然是一个有序的序列。为满足这一要求,以弹出序列为单调递增的序列为例,如果弹出的序列是单增的,那么栈底到栈顶的元素必然是单减的,此时压栈逻辑为:新元素比当前栈顶元素小,出栈逻辑为:新元素比当前栈顶元素要大,那不断弹出栈顶元素直到新元素比当前栈顶元素小或栈为空。

       为了使用方便,单调栈一般存入的元素是其下标。

        这道题用暴力法会直接超时,适合用单调栈这种空间换时间的方式,一次遍历就可以得到结果。设置单调栈s,先将第一个元素的下标0压入栈中,然后遍历剩下的元素。如果当前nums[i]小于等于栈顶下标对应的元素nums[s.peek()],则压栈;否则,计算栈顶下标和当前下标的差值i - s.peek(),即相差天数,存入结果数组中,然后弹出栈顶元素,重复操作直到栈空或栈顶元素大于nums[i]。

class Solution {public int[] dailyTemperatures(int[] temperatures) {int[] res = new int[temperatures.length];Stack<Integer> stack = new Stack<>();stack.push(0);for (int i = 1; i < temperatures.length; i++) {while (!stack.isEmpty() && temperatures[stack.peek()] < temperatures[i]) {res[stack.peek()] = i - stack.pop();}stack.push(i);}return res;}
}

遇到的困难

        单调栈用起来还是不太熟练。

496.下一个更大元素 I

题目链接:​​​​​​​496.下一个更大元素 I

代码随想录题解:​​​​​​​496.下一个更大元素 I

视频讲解:单调栈,套上一个壳子就有点绕了| LeetCode:496.下一个更大元素_哔哩哔哩_bilibili

解题思路:

       看答案。

看完代码随想录之后的想法 

        先理解题意:A B两个数组,先找到A数组中每一个元素在B数组中的所在位置,然后求从这个位置往后,找到比该元素大的第一个元素。

        其实翻译过来跟第一题要求的东西是一样的,不同的是多了一个寻找下标的过程,以及求B数组单调栈时,其中可能存在A数组中不存在元素的情况,需要跳过。

        由于两个数组中都没有重复元素,所以寻找下标的过程可以用哈希表来完成,用map来记录nums1的元素及其对应下标。设置单调栈用来计算过程,先将nums2数组的第一个下标0压入栈。由于可能不存在合适的元素,所以先初始化结果数组的元素都为-1.

        遍历nums2数组的元素,与上一题类似,如果当前nums2[i]小于等于栈顶下标对应的元素nums2[s.peek()],则压栈;否则,先检查栈顶对应元素nums2[s.peek()]在nums1中是否存在,即map中是否存在key为nums2[s.peek()],如果不存在则直接弹出,存在则取出栈顶元素在nums1中对应的下标index = map.get(nums2[s.peek()]),然后更新结果数组res[index] = nums2[i],表示此时nums2[i]是nums1[index]对应的nums2中右边第一个比它大的数。

class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {HashMap<Integer, Integer> map = new HashMap<>();for (int i = 0; i < nums1.length; i++) {map.put(nums1[i], i);}int[] res = new int[nums1.length];Arrays.fill(res, -1);Stack<Integer> s = new Stack<>();s.add(0);for (int i = 1; i < nums2.length; i++) {while (!s.isEmpty() && nums2[i] > nums2[s.peek()]) {if (map.containsKey(nums2[s.peek()])) {int index = map.get(nums2[s.peek()]);res[index] = nums2[i];}s.pop();}s.push(i);}return res;}
}

遇到的困难

        两个数组就绕了很多,理解题意理解了半天,思索如何在一个数组里面找对应另一个数组元素的位置也没想到用哈希,单调栈就更用不起来了。

        还有单调栈由于保存的是数组的下标,而非数组元素,所以使用的时候也要注意,不要把下标当成元素使用。

今日收获

        学习了一下单调栈的用法,很绕很妙。

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

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

相关文章

Flink面试整理-Flink常见API

Apache Flink 提供了多种 API,使开发者能够方便地实现复杂的数据处理和分析任务。以下是 Flink 中一些常见的 API: DataStream API:用于构建实时流处理应用程序。支持事件时间(Event Time)、摄取时间(Ingestion Time)和处理时间(Processing Time)的概念。提供丰富的操…

风电厂数字孪生3D数据可视化交互展示构筑智慧化电厂管理体系

随着智慧电厂成为未来电力企业发展的必然趋势&#xff0c;深圳华锐视点紧跟时代步伐&#xff0c;引领技术革新&#xff0c;推出了能源3D可视化智慧管理系统。该系统以企业现有的数字化、信息化建设为基础&#xff0c;融合云平台、大数据、物联网、移动互联、机器人、VR虚拟现实…

Android 右键 new AIDL 无法选择

提示 (AIDL File)Requires setting the buildFeatures.aidl to true in the build file&#xff09; 解决方式&#xff1a; 在app的build.gradl中 adnroid{} 添加&#xff1a; buildFeatures{aidl true}

Oracle-一次TX行锁堵塞事件

问题背景&#xff1a; 接用户问题报障&#xff0c;应用服务出现大量会话堆积现象&#xff0c;数据库锁堵塞严重&#xff0c;需要协助进行问题定位和排除。 问题分析&#xff1a; 登录到数据库服务器上&#xff0c;首先查看一下数据库当前的等待事件情况&#xff0c;通过gv$ses…

Java|用爬虫解决问题

使用Java进行网络爬虫开发是一种常见的选择&#xff0c;因为Java语言的稳定性和丰富的库支持使得处理网络请求、解析HTML/XML、数据抓取等任务变得更加便捷。下面是一个简单的Java爬虫示例&#xff0c;使用了Jsoup库来抓取网页内容。这个示例将展示如何抓取一个网页的标题。 准…

教你零成本,免费使用comfyui复现remini爆火的黏土风格转绘(附完整教程)

在五一假期期间,一款名为Remini的AI照片编辑软件在小红书上迅速走红,其独特的“丑萌”黏土风格滤镜深受广大博主和用户的喜爱,引发了一波热潮,让人们玩得不亦乐乎。 Remini软件提供的这种视觉效果虽然看起来有点“丑萌”特效,然而,正是这种独树一帜的画风,使得Remini迅速…

【Django学习笔记(十)】Django的创建与运行

Django的创建与运行 前言正文1、安装Django2、创建项目2.1 基于终端创建项目2.2 基于Pycharm创建项目2.3 两种方式对比 3、默认项目文件介绍4、APP5、启动运行Django5.1 激活App5.2 编写URL和视图函数对应关系5.3 启动Django项目5.3.1 命令行启动5.3.2 Pycharm启动5.3.3 views.…

C++缺省参数、函数重载、引用

一、缺省参数 1.1缺省参数概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void func(int n 0) {cout << n << endl; }int main() {func();func…

【经验01】spark执行离线任务的一些坑

项目背景: 目前使用spark跑大体量的数据,效率还是挺高的,机器多,120多台的hadoop集群,还是相当的给力的。数据大概有10T的量。 最近在出月报数据的时候发现有一个任务节点一直跑不过去,已经超过失败次数的阈值,报警了。 预警很让人头疼,不能上班摸鱼了。 经过分析发现…

Apache Knox 2.0.0使用

目录 介绍 使用 gateway-site.xml users.ldif my_hdfs.xml my_yarn.xml 其它 介绍 The Apache Knox Gateway is a system that provides a single point of authentication and access for Apache Hadoop services in a cluster. The goal is to simplify Hadoop securit…

LANCET:常见统计使用错误+规避建议!

国际顶级医学期刊《柳叶刀》&#xff08;The Lancet&#xff09;最近发表了一篇实用的通讯文章&#xff08;Correspondence&#xff09;&#xff0c;该篇Correspondence基于过去3年内对提交给《柳叶刀》的1000多篇manuscripts进行审核的经验&#xff0c;总结了科研report中常见…

IOC 和 DI

IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;和DI&#xff08;Dependency Injection&#xff0c;依赖注入&#xff09;是面向对象编程中的两个重要概念&#xff0c;它们之间有密切的关联。 IOC&#xff08;控制反转&#xff09;&#xff1a; IOC是一种…

【系统架构师】-UML-用例图(Use Case)

1、概述 用于表示系统功能需求&#xff0c;以及应用程序与用户或者与其他应用程序之间的交互关系。 2、组成 参与者&#xff08;Actors&#xff09;&#xff1a;与系统交互的用户或其他系统。用一个人形图标表示。用例&#xff08;Use Cases&#xff09;&#xff1a;系统需要…

2024年第九届数维杯数学建模A题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 竞赛信息4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

前端权限控制

分享一些在Vue项目中实现权限控制的方法 方法描述基于路由的权限控制使用Vue Router中的路由守卫&#xff08;beforeEach&#xff09;来检查用户权限&#xff0c;并根据权限决定是否允许导航到特定路由。基于角色的权限控制将用户的角色信息与权限关联&#xff0c;根据用户的角…

汇凯金业:黄金价格波动的原因是什么

黄金价格波动的原因通常是多方面的&#xff0c;包括但不限于&#xff1a; 经济数据&#xff1a;比如就业数据、通胀率、GDP增长率等对经济状况的指标不及预期&#xff0c;可能会增加黄金作为避险资产的吸引力。 货币政策&#xff1a;央行的利率决策、货币供应量的变化、量化宽…

山东首版次什么的要求有

在山东首版次申报中&#xff0c;测试报告是一个关键的组成部分。测试报告需要包含的内容通常与软件产品的质量、性能和安全性等方面相关。以下是在山东首版次申报中&#xff0c;测试报告可能需要包含的内容&#xff1a; 引言&#xff1a;简要介绍测试的目的、范围、背景以及测试…

当前主机使用的磁盘以及带宽情况

今日看到有用户在论坛留言反馈他买了Hostease Linux虚拟主机&#xff0c;想要查看当前主机使用的磁盘以及带宽情况&#xff0c;但是不知道如何查看。因为这边也是对于Hostease的虚拟主机产品是有所了解的&#xff0c;知道他们都是默认带管理面板的操做起来很方便的&#xff0c;…

基于FPGA的数字信号处理(10)--定点数的舍入模式(1)四舍五入round

1、前言 将浮点数定量化为定点数时&#xff0c;有一个避不开的问题&#xff1a;某些小数是无法用有限个数的2进制数来表示的。比如&#xff1a; 0.5(D) 0.1(B) 0.1(D) 0.0001100110011001~~~~(B) 可以看到0.5是可以精准表示的&#xff0c;但是0.1却不行。原因是整数是离散的…

Linux学习笔记2---Makefile

单个文件编译用gcc编译确实是挺方便的&#xff0c;但是多个文件需要编译一个个的编译就属实是麻烦了&#xff0c;而针对多文件编译也有快捷的办法&#xff0c;即Makefile脚本。要运行Makefile需要先安装make程序。 apt install make 1.什么是Makefile 一个工程中的源文件不计…