【LeetCode】503, 下一个更大元素 II。 难度等级:中等。深入理解 “下一个更大/更小问题” 常用的单调栈方法

news/2024/11/19 8:52:24/

文章目录

    • 0. 题目
    • 1. 我的解法:单调栈
      • 1.1 分析
      • 1.2 初级代码,根据单调栈思路直接写
      • 1.3 简化版代码

0. 题目

给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。

数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。

示例 1:

输入: nums = [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数; 
第二个 1 的下一个最大的数需要循环搜索,结果也是 2

示例 2:

输入: nums = [1,2,3,4,3]
输出: [2,3,4,-1,4]

1. 我的解法:单调栈

1.1 分析

本题与 【LeetCode】739, 每日温度。 难度等级:中等。多种解法,值得研究 非常相似,建议先看 739题

本题比 739 题更难的两个点是:

  1. 数组要首尾循环,因此要想办法实现数组循环遍历。
  2. 如果某个数不存在更大的数,则返回-1;其实就是要额外找到数组中的所有最大值的位置(最大值不止一个)

这两个难点都有巧妙的解决办法:

  1. 直接循环遍历数组很麻烦,换个思路,将数组复制一下,拼成一个是原来2倍长度的新数组,遍历一次新数组不就相当于循环遍历了两次原数组吗?
  2. 将返回值列表用 -1 初始化,有更大值的位置会用新值覆盖,最大值的位置就不会做处理,仍然会保留 -1

这样两个难点都解决了,我们接下来考虑用什么方法。结论是:

对于「找最近一个比当前值大/小」的问题,都可以使用单调栈来解决

为什么这种问题都能用单调栈呢?详细解释可以参考 为啥使用「单调栈」呀?从「朴素解法」的角度去理解「单调栈」

1.2 初级代码,根据单调栈思路直接写

根据单调栈思路直接写出来的代码如下:

class Solution:def nextGreaterElements(self, nums: List[int]) -> List[int]:# 实现循环的一种方法:将数组复制一遍;取前 nums 个结果即可new_nums=nums*2length=len(new_nums)ans=[-1]*length    # 为了避免单独判断最大的元素的位置,用-1初始化数组stack=[]for i in range(length):if not stack:stack.append([i,new_nums[i]])else:if new_nums[i]>stack[-1][1]:while stack and new_nums[i]>stack[-1][1]:ans[stack[-1][0]]=new_nums[i]stack.pop()stack.append([i,new_nums[i]])else:stack.append([i,new_nums[i]])return ans[:length//2]

1.3 简化版代码

很显然,1.2 中的代码实可以简化的,简化后的代码如下:

class Solution:def nextGreaterElements(self, nums: List[int]) -> List[int]:# 实现循环的一种方法:将数组复制一遍;取前 nums 个结果即可new_nums=nums*2length=len(new_nums)ans=[-1]*length    # 为了避免单独判断最大的元素的位置,用-1初始化数组stack=[]for i in range(length):if not stack:stack.append([i,new_nums[i]])else:while stack and new_nums[i]>stack[-1][1]:ans[stack[-1][0]]=new_nums[i]stack.pop()stack.append([i,new_nums[i]])return ans[:length//2]

http://www.ppmy.cn/news/894722.html

相关文章

【Java】StringBuffer和StringBuilder

共同点 他们都是可变的,在每次进行修改操作时,都不会产生新的对象,所以在进行修改的时候,尽量使用这两种类型的字符串 不同点 StringBuffer在单线程中效率高 StringBuilder用于多线程确保安全性 测试代码 public class test …

数学分析原理 第2卷 第9版

【作 者】T.M.菲赫金哥尔茨著;丁寿田译 【丛书名】俄罗斯数学教材选译 【形态项】 363 【出版项】 北京:高等教育出版社 , 2013.03 【ISBN号】978-7-04-035185-9 【中图法分类号】O17 【原书定价】59.00 【主题词】数学分析 【参考文献格式】 T.M.菲…

《微积分:一元函数微分学》——狄利克雷函数

定义 性质 狄利克雷函数是一个有界的偶函数,且任何有理数都是它的周期,它没有最小的周期 应用 函数 f(x) 在点 xx0 可导,那么 f(x) 在点 xx0 处必然连续,如果函数 f(x) 在点 xx0 处可导,并不一定存在点 xx0 的某个邻…

Echarts数据可视化教程(超详细,持续更新中....)

作者有话对你说 随着前端的飞速发展,近年来数据可视化越来越火,有些公司的业务跟地图、位置、大数据等脱离不开关系,所以数据可视化甚至成了单独的一门前端行业,比如在杭州地区的前端可视化职位不但有一定的需求量且高薪&#xff…

知识图谱之《海贼王-ONEPICE》领域图谱项目实战(含码源):数据采集、知识存储、知识抽取、知识计算、知识应用、图谱可视化、问答系统(KBQA)等

项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域):汇总有意义的项目设计集合,助力新人快速实…

数学教材推荐

数学书籍推荐 引言 一 数学分析 二 高等数学 三 高等代数 四 线性代数 五 解析几何 六 概率论 七 常微分方程 八 偏微分方程 九 数学物理方程(数学物理方法) 十 复变函数 十一 实变函数 十二 泛函分析 十三 高等几何 十四 微分几何 十五 拓扑学 十六 近世代数…

鲲志说:向我跌宕起伏,喜忧参半的2022致敬!

今天是2022的倒数第二天,就着CSDN的活动正好为自己做一个年度总结,也确实需要做一个年度总结来正式和过去的一年道个别 回想这一年,确实经历了很多,寒冬裁员、千里相赴见双方父母、成功夺冠🐑。。。成年人的世界确实很…

中心极限与大数定理律的关系_实数系基本定理(一)

确界 设 是 中的一个非空有上界数集. 若实数 满足: (1)对任何 ,有 ,即 是 的上界; (2)对于任意给定的 ,存在 ,使得 , 即 是 的最小上界. 则称…