力扣每日一题 6/24 模拟 数组 单调栈

  • 博客主页:誓则盟约
  • 系列专栏:IT竞赛 专栏
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍ 

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。

示例 2:

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

提示:

  • 1 <= nums.length <= 10**4
  • -10**9 <= nums[i] <= 10**9

分析问题:

思路1:

        首先,通过两次遍历数组(实际是通过对索引取模来模拟)。在每次遍历中,如果当前元素大于栈顶元素所对应的数组值,就将栈顶元素弹出,并在结果数组中记录当前元素为栈顶元素的下一个更大元素。

        在前 n 个位置时,将索引存入栈中。如果在后续的遍历中找到了更大的元素,就进行相应的处理。

        最终,结果数组 ans 中存储了每个元素对应的下一个更大元素,如果没有则为 -1 。

思路2:

        模拟。根据题目给的要求,我们遍历整个数组,去寻找他下一个更大的值,这里要把数组变成循环数组,因为我们要遍历整个列表。变成循环数组的方法无非就是把遍历的长度加长一点,然后模上len(nums),时间复杂度是O(N**2),但是这个方法用时间换空间,空间复杂度很低。


 

代码实现:

思路1:

class Solution:def nextGreaterElements(self, nums: List[int]) -> List[int]:n = len(nums)stack = []ans = [-1]*n for i in range(2*n):x = nums[i % n]while stack and x > nums[stack[-1]]:ans[stack.pop()] = x if i < n:stack.append(i)return ans

这种方法时间复杂度和空间复杂度都是比较优越的。 

 

思路2:

class Solution:def nextGreaterElements(self, nums: List[int]) -> List[int]:n=len(nums)ls=[]for i in range(len(nums)):for j in range(i+1,i+len(nums)+1):if j%n==i: ls.append(-1)breakelif nums[j%n] > nums[i]:ls.append(nums[j%n])breakreturn ls

 

        思路2是比较容易想出来的一种方法,他的优点就在于空间复杂度较低,通俗易懂。但是时间复杂度较高。

 


总结:

思路一(使用栈)代码详解

  1. 首先,获取输入数组 nums 的长度 n ,并初始化一个空栈 stack 和结果数组 ans ,其中 ans 中的每个元素初始值都为 -1 。
  2. 然后,通过一个循环,模拟对数组进行两轮遍历(实际是通过 i % n 来实现取模操作,达到循环数组的效果)。
  3. 对于每次循环获取的当前元素 x ,如果栈不为空且 x 大于栈顶元素对应的数组值,就将栈顶元素弹出,并在结果数组 ans 中记录 x 为弹出元素的下一个更大元素。
  4. 在前 n 次循环中(即第一次遍历数组时),将当前索引 i 存入栈中。
  5. 最终,返回结果数组 ans ,其中每个位置存储了对应元素的下一个更大元素,如果没有则为 -1 。
思路二(使用两层循环)代码详解

  1. 首先获取输入数组 nums 的长度 n ,并创建一个空列表 ls 用于存储结果。
  2. 外层循环遍历数组中的每个元素。对于每个元素,通过内层循环从其右侧的下一个位置开始,模拟循环数组的方式进行查找。
  3. 在内层循环中,如果当前位置经过取模后又回到了起始位置(即 j % n == i ),说明在右侧没有找到更大的元素,将 -1 存入结果列表 ls 并结束内层循环。
  4. 如果找到了右侧第一个比当前元素大的元素(即 nums[j % n] > nums[i] ),将该更大元素存入结果列表 ls 并结束内层循环。
  5. 外层循环结束后,返回结果列表 ls 。

        总的来说,第一段代码通过栈来优化查找过程,空间复杂度相对较低;第二段代码使用两层循环直接查找,逻辑相对简单直观,但时间复杂度可能相对较高。


考点

  • 对数组的遍历操作。
  • 循环边界的处理,包括通过取模实现数组的循环遍历。
  • 利用栈或多重循环来比较元素大小。
收获

  • 学习了两种不同的方法来解决同一类问题,一种是利用栈的特性,另一种是通过两层循环。
  • 加深了对数组操作和循环控制的理解,尤其是在处理循环边界和重复利用数组元素的场景。
  • 体会到了不同算法的时间复杂度和空间复杂度的差异,第一段代码使用栈的方式在空间复杂度上相对更优,而第二段代码的两层循环在时间复杂度上可能相对较差。
  • 提高了根据问题需求设计合适算法的能力,需要在不同的场景中权衡算法的效率和实现的难易程度。

 “我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。”——《Enchiridion》

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

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

相关文章

数据分析师怎么去快速读一本书

背景&#xff1a;优秀的数据分析师怎么去快速读一本书 一本好书的判断依据 1.有没有再次印刷&#xff0c;三次印刷一般是好书 2.作者 快读选书顺序 1.目录->定位这是一本什么书 2.看内容的呈现形式&#xff0c;内容的各部分占比大概是什么类型的信息。 3.去看自己擅长的知…

使用原子子表创建可重用的子组件

原子子表是一个图形对象&#xff0c;可帮助您在Stateflow图表中创建独立的子部件。原子子表允许&#xff1a; 对具有多个状态或层次结构的图表进行微小更改后&#xff0c;模拟速度更快。 在多个图表和模型中重复使用相同的状态或子表。 易于团队开发&#xff0c;适用于在同一图…

在现代多核和多线程环境中,如何优化 C 语言程序以充分利用硬件并行性?

在现代多核和多线程环境中&#xff0c;要优化C语言程序以充分利用硬件并行性&#xff0c;可以考虑以下几点&#xff1a; 并行算法设计&#xff1a;将任务分解为多个独立的子任务&#xff0c;并使用多线程或多进程同时执行这些子任务。这可以通过将问题分解为多个部分&#xff0…

小阿轩yx-MySQL备份与恢复

小阿轩yx-MySQL备份与恢复 企业对信息系统依赖性越来预高&#xff0c;数据库担任着重要角色如果发生意外宕机或数据丢失&#xff0c;损失是非常严重的数据库管理员必须针对具体的业务要求制定详细的数据库备份与灾难恢复策略 对数据库要求高的行业 银行证券电信等 MySQL 数…

PHP的SHA256WithRSA签名和Curl POST请求函数

getCustomerEncryptionKey - 获取加密秘钥 /** * 获取加密秘钥 * param array $params * return string */ public function getCustomerEncryptionKey(array $params): string { //1.ASCII码&#xff08;字典序-升序&#xff09;排序…

Python网络爬虫实战6—下一页,模拟用户点击,切换窗口

【前期提要】感兴趣的可以看看往期文章哈~ Python网络爬虫5-实战网页爬取 Python网络爬虫4-实战爬取pdf Pyhon网络爬虫3-模拟用户点击 Python网络爬虫实战2-下载url下的pdf Python网络爬虫基础1 1.需求背景 针对长虹美菱电器说明书网页形式&#xff0c;编写爬虫代码&#xff…

IO模型简介

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言简介正文实现总结 前言 简介 Java1.4之前的早期版本,Java对I/O的支持并不完善,开发人员在开发高性能I/O程 序的时候,会面临一些巨大的挑战和困难,主要问题如下…

A36 STM32_HAL库函数 之PCD通用驱动 -- B -- 所有函数的介绍及使用

A36 STM32_HAL库函数 之PCD通用驱动 -- B -- 所有函数的介绍及使用 1 该驱动函数预览1.11 HAL_PCD_SOFCallback1.12 HAL_PCD_ResetCallback1.13 HAL_PCD_SuspendCallback1.14 HAL_PCD_ResumeCallback1.15 HAL_PCD_ISOOUTIncompleteCallback1.16 HAL_PCD_ISOINIncompleteCallbac…

【财务数字化转型之底座】集团企业财务数据中台系统建设方案

引言&#xff1a;随着企业规模的不断扩大和业务的复杂化&#xff0c;传统的财务管理模式已难以满足集团企业的数据整合、分析和决策需求。因此&#xff0c;建设一个高效、稳定、安全的财务数据中台系统&#xff0c;成为集团企业数字化转型的重要一环。本方案旨在构建一个集数据…

Android SurfaceFlinger——无效化和同步信号回调(十)

上一篇文章分析了屏幕热插拔回调回调,同时通过前面文章的介绍,我们知道一共有三个比较重要的回调,这里我们看一看另外两个回调函数无效化和垂直同步的相关调用。 一、回调介绍 这两个回调从表面看都是通知屏幕刷新的,但本质上还是有区别的。 无效化回调(Invalidate Hook…

算力服务先锋!和鲸科技入选《2024中国智算产业生态图谱》

2024 年 6 月 18 日&#xff0c;由科智咨询发起的《2024中国智算产业生态图谱》正式发布&#xff0c;依托 ModelWhale 构建的智算算力资源服务&#xff0c;以及深耕多年的 ModelWhale 数据科学协同平台优势&#xff0c;和鲸科技成功入选。 “智算时代”技术不断进步&#xff0c…

Open vSwitch 内核空间的流表同步

一、内核空间的流表同步 在 Open vSwitch 的数据包转发过程中&#xff0c;当数据包在 Datapath 模块无法完全处理时&#xff0c;会通过 upcall 调用将数据包交给用户空间的 vswitchd 守护进程&#xff0c;由 vswitchd 守护进程生成相应的流表和行为&#xff0c;并发送回内核空间…

什么是空间复杂度?

空间复杂度 是指算法在计算机中执行时所需额外空间的度量&#xff0c;记作S(n)。这个空间包括算法在执行时所使用的所有额外存储空间&#xff0c;包括变量&#xff08;包括静态变量和动态变量&#xff09;、递归调用栈、以及输入输出数据所占据的存储空间等。其中&#xff0c;n…

指针并不是用来存储数据的,而是用来存储数据在内存中地址(内存操作/函数指针/指针函数)

推荐&#xff1a;1、4、5号书籍 1. 基本概念 首先&#xff0c;让小明了解指针的基本概念&#xff1a; 指针的定义&#xff1a;指针是一个变量&#xff0c;它存储的是另一个变量的地址。指针的声明&#xff1a;例如&#xff0c;int *p表示一个指向整数的指针变量p。 2. 形象…

生命在于学习——Python人工智能原理(2.6.1)

六 Python的文件系统 6.1 打开文件 在Python中&#xff0c;可以使用内置的open函数来打开文件&#xff0c;open函数的基本语法如下&#xff1a; file open(file_name, moder, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue, openerNone)参数说明&#…

【Web3】Web3.js 启动!并解决Web3 is not a constructor报错

苏泽 大家好 这里是苏泽 一个钟爱区块链技术的后端开发者 本篇专栏 ←持续记录本人自学智能合约学习笔记和经验总结 如果喜欢拜托三连支持~ 本节教大家如何启动Web3.js 目录 Web3 启动&#xff01; 于是很愉快的报错 创建实例&#xff01; 出来了 Web3&#xff1a;模块…

【Android】设置光标颜色和图标

创建主题 该主题可以更改文字下方拖拽手柄的颜色 <?xml version"1.0" encoding"utf-8"?> <resources><style name"RedTextCursor"><item name"android:colorControlActivated">#FF0000</item></…

《PIDNet: A Real-time Semantic Segmentation Network Inspired by PID Controllers》

期刊&#xff1a;CVPR 年份&#xff1a;2023 代码&#xff1a;https://github.com/XuJiacong/PIDNet 摘要 双分支网络架构已经证明了它在实时语义分割任务中的有效性和有效性。然而&#xff0c;高分辨率细节和低频上下文的直接融合的缺点是细节特征很容易被周围的上下文信息…

快储存,分布式文件系统,对象储存

Ceph块存储 镜像快照 快照可以保存某一时间点时的状态数据快照是映像在特定时间点的只读逻辑副本希望回到以前的一个状态&#xff0c;可以恢复快照使用镜像、快照综合示例 rbd create img1 --size 10G 创建镜像rbd ls 查看镜像 rbd info img1 #查看…

Win32消息机制原理及消息运转

一.消息机制原理 1.消息类型&#xff1a; WIndows定义的一系列WM_XXX开头的&#xff0c;用来表示键盘按键&#xff0c;鼠标点击&#xff0c;窗口变化&#xff0c;用户自定义等各种消息; 2.消息队列&#xff1a; Windows为每一个正在运行的程序维护一个消息队列应用程序的消…