leetcode496. 下一个更大元素 I 【单调栈】

news2024/11/16 5:22:09

【简单题】(暴力遍历法很简单)但是时间复杂度很高,n的立方级别了。。。

代码:

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        vector<int> ans;	// 存放结果
        for (int i = 0; i < nums1.size(); i++) {
            int t = nums1[i];	// 暂存要查找的值
            for (int j = 0; j < nums2.size(); j++) {	// 在nums2中找与t相等的值
                if (nums2[j] == t) {	// 如果找到相等的值,就往后找第一个比他大的
                    int k;
                    for (k = j + 1; k < nums2.size(); k++) {
                        if (nums2[k] > t) {	// 找到第一个比它大的元素,压入该元素入栈
                            ans.push_back(nums2[k]);
                            break;
                        }
                    }
                    if (k == nums2.size()) {	// 遍历完nums2数组,没有找到比它大的元素。压入 -1 入栈
                        ans.push_back(-1);
                    }
                }
            }
        }
        return ans;
    }
};

运行结果:

 

进阶方法:

进阶:你可以设计一个时间复杂度为 O(nums1.length + nums2.length) 的解决方案吗?

答案思路:【单调栈】

怎么样才能使得 用 nums1中的元素去 nums2中查找的时候,能够很快的不用遍历就可以查到第一个比它大的元素呢?

先预处理 num2,使得对于他的每个元素,用一个哈希表来存储第一个比他大的元素的映射。

步骤(参考leetcode官方题解)

遍历完之后 hashmap 中存储的键值对如下所示:

 

自己的话总结:

从后往前遍历(当前值为t),如果栈中的值比 t 小,则出栈到没有比它小 或 栈空位置。然后设置哈希映射,键为 t,值为 栈顶元素。然后将该元素入栈。直到遍历完第一个元素。

这样,对于 nums2中的每一个元素,在hashmap中都存储了 第一个比他大的元素 的映射。

注意:

使用 unordered_map 时,要引入库文件:#include <unordered_map>

代码:

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        unordered_map<int, int> mp;	// 设置哈希表
        stack<int> st;	 // 栈

        for (int i = nums2.size() - 1; i >= 0; i--) {	// 从后往前遍历 nums2
            int t = nums2[i];
            while (!st.empty() && t > st.top())		// 如果栈非空的条件下,当前值 > 栈顶元素,就出栈
                st.pop();
            if (st.empty()) {	// 如果栈为空,说明在该数组中,该元素没有第一个比它大的元素,设置它的映射值为 -1
                mp[t] = -1;
            }
            else {
                mp[t] = st.top();	// 如果栈非空,那么该元素的哈希映射值为 栈顶元素。
            }
            st.push(t);	
        }

        vector<int> ans;
        for (int i = 0; i < nums1.size(); i++) {
            ans.push_back(mp[nums1[i]]);
        }
        return ans;
    }
};

 

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

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

相关文章

Vue2向Vue3过度核心技术computed计算属性

目录 1 computed计算属性1.1 概念1.2 语法1.3 注意1.4.案例1.5.代码准备 2 computed计算属性 VS methods方法2.1 computed计算属性2.2 methods计算属性2.3 计算属性的优势2.4 总结 3 计算属性的完整写法 1 computed计算属性 1.1 概念 基于现有的数据&#xff0c;计算出来的新属…

抓包相关,抓包学习

检查网络流量 - 提琴手经典 (telerik.com) Headers Reference - Fiddler Classic (telerik.com) 以上是fiddler官方文档 F12要勾选保留日志 不勾选的话跳转到新页面之前页面的日志不会在下方显示 会保留所有抓到的包 如果重定向到别的页面 F12抓包可能看不到响应信息,但是…

在Jupyter Notebook中添加Anaconda环境(内核)

在使用前我们先要搞清楚一些事&#xff1a; 我们在安装anaconda的时候它就内置了Jupyter Notebook&#xff0c;这个jupyter初始只有base一个内核&#xff08;显示为Python3&#xff09; 此后其实我们就不需要重复安装完整的jupyter notebook了&#xff0c;只要按需为其添加新的…

Nexus 如何配置匿名用户访问一个仓库

现在有这样一个需求&#xff0c;我们需要匿名用户访问 Nexus 的一个公共仓库。 设置 Roles 在满足这个需求之前&#xff0c;我们需要设置一个 Roles。 Role 的名字是可以随填写的。 这里关键的问题在你需要访问的仓库的 View 的权限需要设置 Read 和 Browse 这 2 个权限。 如…

保姆级使用vmware安装Ubuntu-server版

保姆级VMware安装Ubuntu20服务器版 文章目录 保姆级VMware安装Ubuntu20服务器版前期准备一、安装vmware二、下载Ubuntu镜像 VMware安装Ubuntu201. 启动Workstation Pro或者Workstation Player,进入软件后新建一个虚拟机2. 进入引导界面选择默认的即可3. 点击下一步即可4. 选择操…

【HSPCIE仿真】HSPICE仿真基础

HSPICE概述 1. HSPICE简介3. 标准输入文件4. 标准输出文件3. HSPCIE仿真过程 1. HSPICE简介 SPICE &#xff08;Simulation Program with IC Emphasis&#xff09;是1972 年美国加利福尼亚大学柏克莱分校电机工程和计算机科学系开发 的用于集成电路性能分析的电路模拟程序。 …

4.1011

目录 四次挥手中收到乱序的FIN包会如何处理&#xff1f; 在 TIME_WAIT 状态的 TCP 连接&#xff0c;收到 SYN 后会发生什么&#xff1f; 四次挥手中收到乱序的FIN包会如何处理&#xff1f; 如果FIN报文比数据包先道道客户端&#xff0c;此时FIN是一个乱序报文&#xff0c;此时…

双向交错CCM图腾柱无桥单相PFC学习仿真与实现(3)硬件功能实现

前言 前面介绍了双向交错CCM图腾柱的系统设计仿真实现&#xff0c;仿真很理想 双向交错CCM图腾柱无桥单相PFC学习仿真与实现&#xff08;1&#xff09;系统问题分解_卡洛斯伊的博客-CSDN博客 然后又介绍了SOG锁相环仿真实现的原理 双向交错CCM图腾柱无桥单相PFC学习仿真与实…

Python项目开发案例————学生信息管理系统(附源码)

一、学生信息管理系统 本文使用Python语言开发了一个学生信息管理系统&#xff0c;该系统可以帮助教师快速录入学生的信息&#xff0c;并且对学生的信息进行基本的增、删、改、查操作&#xff1b;还可以实时地将学生的信息保存到磁盘文件中。 1.1 需求分析 为了顺应互联网时代…

ELK + Kibana + Logstash实现可视化日志

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;elasticsearch、kibana、logstash、日志收集、日志可视化☀️每日 一言&#xff1a;坚持就是胜利啊&#xff0c;哥~ 一、前言 面试官&#xff1a;在日常开发工作中你们是如何查看日志的呢&#x…

9.2 互补功率放大电路

目前使用最广泛的是无输出变压器的功率放大电路&#xff08;OTL 电路&#xff09;和无输出电容的功率放大电路&#xff08;OCL 电路&#xff09;。 一、OCL 电路的组成及工作原理 为了消除图9.1.5所示的基本 OCL 电路所产生的交越失真&#xff0c;应当设置合适的静态工作点&a…

SpringBoot入门篇1 - 简介和工程创建

目录 SpringBoot是由Pivotal团队提供的全新框架&#xff0c; 其设计目的是用来简化Spring应用的初始搭建以及开发过程。 1.创建入门工程案例 ①创建新模块&#xff0c;选择Spring初始化&#xff0c;并配置模块相关基础信息 ②开发控制器类 controller/BookController.jav…

改进YOLO系列:9.添加S2Attention注意力机制

添加S2Attention注意力机制 1. S2Attention注意力机制论文2. S2Attention注意力机制原理3. S2Attention注意力机制的配置3.1common.py配置3.2yolo.py配置3.3yaml文件配置1. S2Attention注意力机制论文 论文题目:S 2 -MLPV2: IMPROVED SPATIAL-SHIFT MLP ARCHITECTURE…

【项目实战典型案例】05.前后端分离的好处(发送调查问卷)

目录 一、背景二、思路三、过程1、主要的业务逻辑2、解决问题的思路 四、总结五、面向对象的好处 一、背景 以下流程图是给用户发送调查问的整体流程&#xff0c;将不必要的业务逻辑放到前端进行处理。这样导致逻辑混乱难以维护。前后端分离的其中一个目的是将功能的样式放在了…

go语言学习之有关变量的知识

文章目录 变量的学习1.变量的使用步骤2.变量的注意事项3.变量使用的三种方式&#xff1a;4.程序中 号的使用5.变量的数据类型1&#xff09;int数据类型2&#xff09;小数类型浮点型3&#xff09;**字符类型**4&#xff09;**字符串&#xff08;String&#xff09;类型**5&…

excel 分组排序

excel中会遇到对不同分组数据进行排序&#xff0c;比如对于不同班级里的学生按照分数高低进行升序排序&#xff0c;可以采用如下公式 SUMPRODUCT((A$2:A$12A2)*(C$2:C$12>C2))1 如果需要 进行降序排序&#xff0c;将公式中的大于号替换为小于号即可

Java 体系性能优化工具

Java 体系性能优化 目录概述需求&#xff1a; 设计思路实现思路分析1.oom 异常来说&#xff1a;2.visualvm3.Arthas4.JProfiler &#xff08;全面&#xff09;5.jmeter 特有 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect…

1014. 最佳观光组合;1220. 统计元音字母序列的数目;1011. 在 D 天内送达包裹的能力​

1014. 最佳观光组合 核心思想&#xff1a;枚举优化&#xff0c;简单想法就是枚举i在同时枚举j&#xff0c;但是这样做时间复杂度太高&#xff0c;那么我们就要想办法优化它&#xff0c;values[i] values[j] i - j可以分为values[i] i&#xff0c;values[j] - j两部分&#…

爬虫实战之使用 Python 的 Scrapy 库开发网络爬虫详解

关键词 - Python, Scrapy, 网络爬虫 在信息爆炸时代&#xff0c;我们每天都要面对海量的数据和信息。有时候我们需要从互联网上获取特定的数据来进行分析和应用。今天我将向大家介绍如何使用 Python 的 Scrapy 库进行网络爬虫&#xff0c;获取所需数据。 1. Scrapy 简介 1.1 …