Day12 单调栈 下一个最大元素

503. 下一个更大元素 II

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

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

示例 1:

输入: nums = [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数; 
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
class Solution:def nextGreaterElements(self, nums: List[int]) -> List[int]:n = len(nums)result = [-1] * nstack = []for i in range(2*n):while stack and nums[i % n] > nums[stack[-1]]:result[stack.pop()] = nums[i % n]if i < n:stack.append(i)return result

2*n单纯是为了满足如果第一次从=从头到尾没有找到元素的下一个更大值,就要从头再找一遍因此是两倍数组长度,入栈的时候要满足i<n

笨方法

class Solution:def nextGreaterElements(self, nums: List[int]) -> List[int]:double_arr, n = nums + nums, len(nums)ans = [-1] * nfor i in range(n):j = i + 1while j < n + i:if double_arr[j] > double_arr[i]:ans[i] = double_arr[j]breakj += 1return ans

变型:1019. 链表中的下一个更大节点

给定一个长度为 n 的链表 head

对于列表中的每个节点,查找下一个 更大节点 的值。也就是说,对于每个节点,找到它旁边的第一个节点的值,这个节点的值 严格大于 它的值。

返回一个整数数组 answer ,其中 answer[i] 是第 i 个节点( 从1开始 )的下一个更大的节点的值。如果第 i 个节点没有下一个更大的节点,设置 answer[i] = 0 。

示例 1:

输入:head = [2,1,5]
输出:[5,5,0]

思路:

对每个数,寻找它下一个更大元素

其实就是从尾巴开始往前遍历,如果遍历到的数大于栈顶,则栈顶出栈,直到栈顶有大于这个数的值,那么这个值就是答案,或者栈顶为空,表示这个数后面都没有比他更大的值了,那么他就是最大值,这两种情况后都要把这个值去栈,然后再继续取前面一个节点,因为这个节点可能是前一个结点的较大值。这样一直遍历到node为空

代码

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def nextLargerNodes(self, head: Optional[ListNode]) -> List[int]:ans = []st = []  # 单调栈(节点值)def f(node: Optional[ListNode], i: int) -> None:if node is None:nonlocal ansans = [0] * i  # i 就是链表长度returnf(node.next, i + 1)while st and st[-1] <= node.val:st.pop()  # 弹出无用数据if st:ans[i] = st[-1]  # 栈顶就是第 i 个节点的下一个更大元素st.append(node.val)f(head, 0)return ans

这串代码十分巧妙

递归方式,开头判断当前node是否为空,这样当node为空的时候,就能求出来链表的长度,同时因为return了,所以直接跳转到最后一个节点开始进行下面的while操作,也就自然的完成了从尾巴开始遍历的需求!!

方法二:不使用递归,直接反转链表,这样再从反转后的链表从头结点遍历,相当于从尾巴开始,不过这里要注意,因为此时是倒着记录答案,因此返回的时候要把答案反转

代码:

class Solution:# 206. 反转链表def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:pre = Nonecur = headwhile cur:nxt = cur.nextcur.next = prepre = curcur = nxtreturn predef nextLargerNodes(self, head: Optional[ListNode]) -> List[int]:head = self.reverseList(head)ans = []st = []  # 单调栈(节点值)while head:while st and st[-1] <= head.val:st.pop()  # 弹出无用数据ans.append(st[-1] if st else 0)  # 栈顶就是第 i 个节点的下一个更大元素st.append(head.val)head = head.nextreturn ans[::-1]  # 由于是倒着记录答案的,返回前要把答案反转

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

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

相关文章

[AIGC] 动态规划的类型以及在 LeetCode 上的应用

动态规划是一种解决问题的优秀策略&#xff0c;它适用于涉及优化问题、组合问题及最短路径问题等领域。下面我们来探究几类常见的动态规划问题&#xff0c;并提供相应的 LeetCode 题目以及 Java 代码实现。 文章目录 1. 一维动态规划2. 二维动态规划3. 背包型动态规划 1. 一维动…

Unity URP简单烘焙场景步骤

Unity URP简单烘焙场景步骤 前言项目场景布置灯光模型Lighting设置环境设置烘焙前烘焙后增加角色 问题解决黑斑硬边清理缓存 参考 前言 项目中要烘焙一个3D场景&#xff0c;用的URP渲染管线&#xff0c;简单记录一下。 项目 场景布置 灯光 因为场景中有能动的东西&#xf…

JAVA每日作业day6.24

ok了家人们今天学习了一些关键字&#xff0c;用法和注意事项&#xff0c;静态代码块这些知识&#xff0c;闲话少叙我们一起看看吧。 一&#xff0c;final关键字 1.1 final关键字的概述 final&#xff1a; 不可改变。可以用于修饰类、方法和变量。 类&#xff1a;被修饰的类&a…

GPT-5 一年半后发布?对此你有何期待?

GPT-5的即将发布无疑引发了广泛的关注和讨论。以下是一些对GPT-5潜在影响和应用场景的见解和期待&#xff1a; 1. 提升工作效率 GPT-5可能会在很多领域进一步提升工作效率。其“博士级”智能在特定任务上的表现可以帮助专业人士更快地完成复杂的工作。例如&#xff0c;在法律…

Zoho邮箱怎么注册?最强完整指南

Zoho企业邮箱&#xff0c;凭借其16年的产品历程和卓越的服务品质&#xff0c;已经成为全球超过1800万企业级客户的信赖之选。今天&#xff0c;我们将手把手教你如何注册Zoho邮箱。 一、Zoho邮箱是什么&#xff1f; Zoho邮箱是Zoho Workplace套件中的核心产品&#xff0c;专门…

Java中的正则表达式使用技巧

Java中的正则表达式使用技巧 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们来探讨一下Java中正则表达式的使用技巧。正则表达式是一种强大…

【昇思初学入门】第六天打卡

函数式自动微分 学习心得 反向传播&#xff1a;神经网络在训练时&#xff0c;会使用一个叫做“反向传播”的方法。这个方法的基本思路是这样的&#xff1a;首先&#xff0c;神经网络会做出一个预测&#xff08;我们称之为“logits”&#xff09;&#xff0c;然后我们将这个预…

【Python】已解决ModuleNotFoundError: No module named ‘requests’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决ModuleNotFoundError: No module named ‘requests’ 一、分析问题背景 在使用Python进行网络编程或数据抓取时&#xff0c;requests库因其简洁易用的特性而受到广泛欢迎。然…

简说caffe

Caffe&#xff08;Convolutional Architecture for Fast Feature Embedding&#xff09;是一个开源的深度学习框架&#xff0c;由加州大学伯克利分校的Berkeley Vision and Learning Center&#xff08;BVLC&#xff09;开发。它主要用于图像分类、分割和图像生成等任务。以下是…

PrestaShop的一些使用介绍

目录 PrestaShop 是一个功能丰富的开源电子商务解决方案。 1. 以下是其基本概念和架构的一些要点&#xff1a; 2. PrestaShop 的模块开发是扩展其功能的重要方式。以下是对 PrestaShop 模块开发的详细介绍&#xff1a; 开发环境准备&#xff1a; 3. PrestaShop 的模块开发允…

Vue项目环境搭建及git仓库新建

不会安装的 可以找下博客&#xff0c;我会在另外一个博客 单独讲解git的安装 接下后启动对应的git bash文件&#xff0c;可以发送快捷方式到桌面 启动git命令的窗口 之后就可以在对应的文件下&#xff0c;启动git命令窗口了 3.码云-项目代码管理仓库 链接&#xff1a;https:…

年化16.6%,全球大类资产使用lightGBM预测轮动——数据缓存提升效率

原创文章第568篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 Dataloader缓存 加载160个因子&#xff0c;10几支大类资产&#xff0c;这个计算还是需要一点时间&#xff0c;尤其在我们频繁运行的时候&#xff0c;需要等待&#xff0c;这里我们…

软件著作权申请(未完待续)

申请网站&#xff1a;中国版权保护中心 注册登录 选择注册身份&#xff0c;个人还是单位

Java基础:IO流

目录 一、定义 1.引言 2.分类 &#xff08;1&#xff09;按照流的方向分 &#xff08;2&#xff09;按操作文件的类型分 3.体系结构 二、字节流&#xff08;以操作本地文件为例&#xff09; 1. FileOutputStream 类 &#xff08;1&#xff09;定义 &#xff08;2&am…

持续总结中!2024年面试必问的操作系统面试题(一)

一、什么是操作系统&#xff1f;它有哪些基本功能&#xff1f; 操作系统&#xff08;Operating System&#xff0c;简称OS&#xff09;是计算机系统中的一个关键软件&#xff0c;它管理计算机硬件资源并提供各种服务以方便用户和应用程序的运行。操作系统充当了用户与计算机硬…

赶紧收藏!2024 年最常见的操作系统面试题(一)

一、进程与线程的区别是什么&#xff1f; 进程与线程是操作系统中两种不同的执行单元&#xff0c;它们在资源使用、调度方式、通信机制等方面存在显著的区别。以下是进程与线程之间的主要区别&#xff1a; 定义&#xff1a; 进程&#xff1a;进程是操作系统进行资源分配和调度…

【tcomat】聊聊tomcat是如何打破双亲委派模型进行类加载的

双亲委派模型 对于JVM类加载器来说&#xff0c;其实就是如下的code&#xff0c;JDK提供的三个类加载器&#xff0c;每个类加载器都加载自己范围内的类。Boot\EXT\APP 三个。双亲委派一句话就是&#xff0c;先让老爸处理&#xff0c;老爸处理不了&#xff0c;给爷爷。爷爷处理不…

x86 的 ebp 寄存器,可能比 cr3 更重要,好好掰扯一下 ebp

在 x86 架构的计算机中&#xff0c;ebp&#xff08;Extended Base Pointer&#xff09;寄存器通常用于指向当前函数的栈帧&#xff08;stack frame&#xff09;的基地址。栈帧是函数调用期间在栈上分配的一块内存区域&#xff0c;用于存储局部变量、函数参数、返回地址和其他临…

JUC线程池最佳实践

参考&#xff1a;Java 线程池最佳实践 | JavaGuide 使用构造函数创建线程池。【使用有界队列&#xff0c;控制线程创建数量】 SpringBoot 中的 Actuator 组件 / ThreadPoolExecutor 的相关 API监控线程池运行状态 是不同的业务使用不同的线程池【父子任务用同一个线程池容易死…

构建LangChain应用程序的示例代码:40、如何使用各种本地版本的 LLaMA2 进行文本到SQL的转换指南

概述 开源的本地大型语言模型&#xff08;LLMs&#xff09;非常适合那些需要数据隐私的应用场景。SQL是一个很好的例子。本指南展示了如何使用各种本地版本的 LLaMA2 进行文本到SQL的转换。 包安装 Python安装命令&#xff1a; ! pip install langchain replicate 大型语言…