( 栈和队列) 503. 下一个更大元素 II ——【Leetcode每日一题】

news2024/11/24 2:54:06

❓503. 下一个更大元素 II

难度:中等

给定一个循环数组 numsnums[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 < = n u m s . l e n g t h < = 1 0 4 1 <= nums.length <= 10^4 1<=nums.length<=104
  • − 1 0 9 < = n u m s [ i ] < = 1 0 9 -10^9 <= nums[i] <= 10^9 109<=nums[i]<=109

💡思路:单调栈

和739. 每日温度解法类似,使用单调栈解决;

  • 单调栈中保存的是下标索引,从栈底到栈顶的下标在数组 nums 中对应的值是单调不升的。

  • 但不同的是该题目是循环数组,对每一个元素最多遍历一圈,即回到自己的位置。

  • 从而可以想到我们可以把这个循环数组 “拉直”, 即复制原数组所有元素拼接在原序列的后面。

  • 这样我们就可以将这个新序列当作普通序列,用上题的方法来处理。

🍁代码:(Java、C++)

Java

class Solution {
    public int[] nextGreaterElements(int[] nums) {
        int n = nums.length;
        int[] ans = new int[n];
        Arrays.fill(ans, -1);
        Stack<Integer> indexs = new Stack<>();
        for(int i = 0; i < 2 * n; i++){
            while(!indexs.isEmpty() && nums[i % n] > nums[indexs.peek()]){
                ans[indexs.pop()] = nums[i % n];
            }
            if(i < n){
                indexs.push(i);
            }
        }
        return ans;
    }
}

C++

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        int n = nums.size();
        vector<int> ans(n, -1);
        stack<int> indexs;
        for(int i = 0; i < 2 * n; i++){
            while(!indexs.empty() && nums[i % n] > nums[indexs.top()]){
                ans[indexs.top()] = nums[i % n];
                indexs.pop();
            }
            if(i < n){
                indexs.push(i);
            }
        }
        return ans;
    }
};

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( n ) O(n) O(n),其中 n 是序列的长度。我们需要遍历该数组中每个元素最多 2 次。
  • 空间复杂度 O ( n ) O(n) O(n),其中 n 是序列的长度。空间复杂度主要取决于栈的大小,栈的大小至多为 n

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!

注: 如有不足,欢迎指正!

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

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

相关文章

为何越来越多人不喜欢“试用期六个月”的公司?网友:感觉不靠谱

众所周知&#xff0c;任何一份工作都有试用期&#xff0c;一般是三月左右。但如果你遇到试用期达到半年的公司&#xff0c;你会不会进入&#xff1f; 近日&#xff0c;就有人遇到了此类公司&#xff0c;并对是否要进入该公司犹豫不决。他在论坛上发帖求助&#xff1a;大家是怎…

京城、京味、京韵:从一台服务器看数字北京

北京&#xff0c;既是首善之都&#xff0c;也是数字化创新之城。 早在1999年&#xff0c;北京就基于整座城市的信息化建设方案&#xff0c;率先提出了“数字北京”。后来&#xff0c;数字北京的魅力在奥运会期间大放异彩&#xff0c;受到了全球高度认可。如今&#xff0c;数字经…

【Python】【进阶篇】10、Django中间件

目录 Django中间件1. Django默认自带中间件1&#xff09;中间的执行与响应顺序2&#xff09;在调用视图之前3&#xff09;在调用视图之后 2. 中间件的作用总结 Django中间件 中间件是一个插件系统&#xff0c;嵌入在 Django 的 Request 和 Response 之间执行&#xff0c;可以对…

使用@Bean注解指定初始化和销毁的方法

bean的生命周期 通常意义上讲的bean的生命周期&#xff0c;指的是bean从创建到初始化&#xff0c;经过一系列的流程&#xff0c;最终销毁的过程。只不过&#xff0c;在Spring中&#xff0c;bean的生命周期是由Spring容器来管理的。在Spring中&#xff0c;我们可以自己来指定be…

apple pencil有买的必要吗?便宜的平替电容笔推荐

在当今世界&#xff0c;电容笔就已经成为一种热门的电子产品&#xff0c;其的各项性能也在不断改进。因此&#xff0c;如何挑选一款性价比高的电容笔成为大家关心的焦点&#xff0c;越来越多的人开始追求更好更廉价的电容笔。那么&#xff0c;哪个品牌的电容笔价格更实惠、性价…

工业设备巨头MSC Industrial Supply的供应链建设——EDI

MSC Industrial Supply提供广泛的工业用品和解决方案&#xff0c;包括切削工具、测量工具、金属加工和设备维护工具、劳动保护用品、工业设备等。MSC Industrial Supply的供应商来自全球各地&#xff0c;包括多个行业的领先品牌&#xff0c;例如Kennametal、Sandvik Coromant、…

【图像分割】【深度学习】SAM官方Pytorch代码-Prompt encoder模块ProEnco网络解析

【图像分割】【深度学习】SAM官方Pytorch代码-Prompt encoder模块PromptEncoder网络解析 Segment Anything&#xff1a;建立了迄今为止最大的分割数据集&#xff0c;在1100万张图像上有超过1亿个掩码&#xff0c;模型的设计和训练是灵活的&#xff0c;其重要的特点是Zero-shot(…

北邮22信通:二叉树层序遍历的非递归算法:A Story Between Two Templates

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 获取更多文章 请访问专栏~ 北邮22信通_青山如墨雨如画的博客-CSDN博客 目录 一.总纲 二.用队列存储 2.1用模板类实现队列 2.1.1核心思路&#xff1a; …

丁鹿学堂:使用vite手动构建vue项目的注意事项和步骤总结

使用yarn 默认安装了nodeJS环境&#xff0c;使用yarn&#xff0c;比npm更好用。 npm install --global yarn使用yarn按钻过vite yarn add -D vite使用yarn初始化项目 yarn init -y安装vite yarn add vite -D安装vue yarn add vue项目目录&#xff1a; 创建index.html sr…

分享一个有意思的文字飞入动画(模仿水滴融合)

先上效果图&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>* {margin: 0;padding: 0;box-sizing: border-box;}:root {--text-…

前后端分离demo 旅馆管理系统(Angular+Springboot)

模型设计 旅馆管理系统&#xff0c;主要涉及到登记入住&#xff0c;退房以及客房和客人信息管理&#xff1b;经过分析抽像出涉及到的实体以及各实体之间的关系&#xff1a;   可以看出整个业务以客房为中心&#xff0c;入住&#xff0c;退房&#xff0c;定价&#xff0c;收费…

Build an SAP Fiori App(一)后面更新中

1.登录 SAP BTP Trial 地址&#xff1a; https://account.hanatrial.ondemand.com 流程可以参考 点击 serviced marketplace 搜索studio 点击创建 点击创建&#xff0c;点击view subscription 点击go to application 创建完成后 添加新链接 Field Value Name ES5 - if you’…

Shell基础入门实战

写在前面 好久没在项目内做自动化了&#xff0c;主要是现阶段在项目内做自动化收益不大&#xff0c;最近开发做batch run的正好缺人&#xff0c;我看了一下代码&#xff0c;就是通过代码读取jar包和远程服务器连接&#xff0c;然后通过shell脚本&#xff0c;向数据库插入数据&a…

如何成为一名优秀的接口自动化测试工程师?了解这些技能是关键

摘要&#xff1a; 随着互联网行业的不断发展&#xff0c;越来越多的应用程序通过API接口提供服务。因此&#xff0c;接口自动化测试成为了保障软件质量的重要环节。本文将介绍接口自动化测试所需掌握的技能&#xff0c;以及相关的历史进程。 B站首推&#xff01;2023最详细自…

什么是 Java 垃圾回收器~

什么是 Java 垃圾回收器 Java 垃圾回收器是 Java 虚拟机 (JVM) 的三个重要模块 (另外两个是解释器和多线程机制) 之一&#xff0c;为应用程序提供内存的自动分配 (Memory Allocation)、自动回收 (Garbage Collect) 功能&#xff0c;这两个操作都发生在 Java 堆上 (一段内存快)…

sqoop安装

文章目录 1. 上传安装包至虚拟机2. 解压安装包到指定路径3. 修改目录名4. 配置环境变量5. 修改配置文件6. 拷贝mysql驱动包7. 验证安装是否成功8. 测试sqoop连接mysql 注&#xff1a;sqoop安装的前提条件是环境已安装java和hadoop 1. 上传安装包至虚拟机 上传安装包sqoop-1.4.…

信通初试第一:无科研无竞赛一战上岸上海交大819学硕感悟

笔者来自通信考研小马哥23上交819全程班学员 信通初试第一&#xff1a;无科研无竞赛一战上岸上海交大819学硕感悟 原创2023-04-27 11:04通信考研小马哥 笔者来自通信考研小马哥23上交819全程班学员 本人情况&#xff1a; 本人是19届交本&#xff0c;本科成绩很差&#xff0c;…

赎金信(Hash的应用)

给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 来源&#xff1a;力扣&#xff0…

Java 实现 YoloV7 目标检测

1 OpenCV 环境的准备 这个项目中需要用到 opencv 进行图片的读取与处理操作&#xff0c;因此我们需要先配置一下 opencv 在 java 中运行的配置。 首先前往 opencv 官网下载 opencv-4.6 &#xff1a;点此下载&#xff1b;下载好后仅选择路径后即可完成安装。 此时将 opencv\b…

WMS是什么?

WMS&#xff08;Warehouse Management System&#xff09;中文译作仓库管理系统&#xff0c;是一种专用于物流仓储管理的IT系统。它主要应用于企业物流中心、配送中心、供应商物料储备中心、电子商务配送中心等仓库管理过程中。 WMS系统可以帮助企业管理和控制其物流仓储流程。…