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

单调栈:739. 每日温度,496. 下一个更大的元素

739. 每日温度

暴力解法

思路:

通过两个循环来实现双指针,i 指针指向当前判断第几天,j 向后找,找到温度比第 i 天高的天数,那 j - i 就代表了当前隔了几天。

下述代码时间复杂度O(n^2),会出现超时的情况。

Code

class Solution(object):def dailyTemperatures(self, temperatures):""":type temperatures: List[int]:rtype: List[int]"""## 暴力做法是什么?两个循环(定位两个位置,left指向第几天数, right指向温度比当前left高的第几天数,二者相减就知道隔了几天)length = len(temperatures)answer = [0] * lengthfor i in range(length):for j in range(i+1, length):if temperatures[j] > temperatures[i]:answer[i] = j - ibreakelse:continuereturn answer

单调栈解法

思路:

  • 用一个存储遍历过的顺序
  • 用一个result数组来记录对比结果

根据题目要求的顺序对数组进行遍历(这道题目要求是从左到右),并将元素的对应下标推入栈中,下个元素来的时候,只需要与栈顶对比大小,比栈顶元素大(题目要求是找到右边比左边大的)的话就将 当前元素下标 - 栈顶元素 来得到 nums[栈顶元素] 与 nums[当前元素下标] 的距离。

栈顶一定是后进的,如果比栈顶元素小则推入栈中;比栈顶大的话就将栈顶退出,并对result[栈顶元素] 进行赋值,来得到栈顶元素与当前元素的距离。随后继续比较,重复这个流程,直到遍历完毕。遍历完毕后,栈里面还有元素怎么办,此时表示在右边找不到比nums[ 栈内元素 ] 大的值了,那其实就是result[栈内元素] = 0,可以对result数组可以初始化为0,这样就不用额外操作了

这个栈是单调递增栈,递增的逻辑体现在栈顶的判断逻辑。如果是小于就推出的话,则是单调递减的逻辑。(顺序:从左到右)

重点强调 栈 存储的是 遍历顺序,即数组的下标。对比大小的逻辑 体现在栈顶,通过nums[当前元素下标]和nums[栈顶元素]判断,result数组来存储两个元素之间的距离

整个流程图可以参考:代码随想录

Code

class Solution(object):def dailyTemperatures(self, temperatures):""":type temperatures: List[int]:rtype: List[int]"""length = len(temperatures)result = [0] * lengthstack = [0]     ## 先将第一个元素下标存到栈中,后面遍历就从下一个元素下标开始遍历for i in range(1, length):# if len(stack) == 0:           ## 可以缩减;与后面的情况进行合并#     stack.append(i)#     continuewhile len(stack) > 0:       ## 栈内有元素## stack[-1] 表示栈顶。要清楚你定义的是个数组,只不过是拿数组来模拟成栈if temperatures[i] > temperatures[stack[-1]]: top = stack.pop()     ## 栈顶推出result[top] = i - topelse:# stack.append(i)  ## 必须放到循环外放,放到这里会存在一个情况,如果栈内只有两个元素;## 当元素2 > 元素1时,此时if成立,else不会执行,元素1弹出后栈变为空栈。如果放到这里进行推栈操作## 的话,会导致元素2没有被推入栈中。breakstack.append(i)     ## 包含了两种情况。1:栈内没有元素,此时推入栈。2. 比栈顶元素小,此时推入栈return result     

在代码上需要注意栈的底层数据结构是一个数组,因此仍然可以通过数组的操作来获得栈顶元素stack[-1],而为什么这个数组可以实现成栈,是因为pop()是右边出,append()是右边进,因此单向进出元素的数组就成为了栈。

496. 下一个更大的元素

理解题意:

  • 在739.每日温度中,比当前数字x的下一个更大元素是在同一个数组中x的右边进行判断
  • 这道题是变成了从nums2中进行判断。
  • 如果在nums2中没找到比x更大的元素,输出-1
  • 如果在nums2中找到和x相等的元素,此时就从该相等的元素这个位置,往右边查找来得到比当前元素大的下一个元素的下标
  • 如果在nums2中找到和x相等的元素,但x后面没有更大的元素,输出-1
http://www.dtcms.com/a/307966.html

相关文章:

  • 【ELasticsearch】集群故障模拟方案(二):磁盘空间满、重选主节点
  • C++ 入门基础(2)
  • Docker compose和Docker-compose的区别
  • 智慧交通中目标检测 mAP↑28%:陌讯多模态融合算法实战解析
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博评论数据可视化分析-点赞区间折线图实现
  • 从“健忘”到“懂我”:构建新一代AI记忆系统
  • 开发指南126-参数管理
  • 【C语言学习】scanf函数
  • TCP 连接管理 之 三次握手详解
  • 在Trae中使用MoonBit月兔1 创建项目
  • 力扣-102. 二叉树的层序遍历
  • 【BUG】nvm无法安装低版本Node.js:The system cannot find the file specified解决方案
  • 关于npm前端项目编译时栈溢出 Maximum call stack size exceeded的处理方案
  • 去重、top_n()、pull()、格式化
  • LCM中间件入门(1):工作原理核心概念及Ubuntu环境下的C++实践
  • 如何在NPM上发布自己的React组件(包)
  • 基于岗位需求的康养休闲旅游服务实训室建设方案
  • 达梦(DM8)常用管理SQL命令(3)
  • JavaScript内存管理完全指南:从入门到精通(通俗版+硬核版)
  • python后端之DRF框架(下篇)
  • Linux 服务器性能优化:性能监控,系统性能调优,进程优先级,内核升级全解析
  • 常见的中间件漏洞(tomcat,weblogic,jboss,apache)
  • 制造业企业如何保障文件外发图纸数据安全的?
  • dubbo源码之消费端启动的高性能优化方案
  • CTE公用表表达式的可读性与性能优化
  • Java项目:基于SSM框架实现的小区物业管理系统【ssm+B/S架构+源码+数据库+毕业论文+开题报告+任务书+远程部署】
  • 解决Git升级后出现的问题
  • DeepSeek SEO关键词优化提升流量增长
  • Linux Shell 条件判断:`test`、`[`、`[[` 命令深度解析
  • centos yum更换阿里源