录第第五十八天——每日温度,下一个更大元素|

单调栈

  • 栈里的元素保持单调递增或者递减,栈内元素是元素下标。
  • 单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次
  • 求一个元素右边第一个更大元素,单调栈就是递增的,如果求一个元素右边第一个更小元素,单调栈就是递减的,顺序是从栈头到栈底。
  • 一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。
    在这里插入图片描述

leetcode 739. 每日温度

题目链接:每日温度
单调栈主要有三个判断条件。

  • 当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
  • 当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
  • 当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况

版本一:

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& T) {
        // 递增栈
        stack<int> st;
        vector<int> result(T.size(), 0);
        st.push(0);
        for (int i = 1; i < T.size(); i++) {
            if (T[i] < T[st.top()]) {                       // 情况一
                st.push(i);
            } else if (T[i] == T[st.top()]) {               // 情况二
                st.push(i);
            } else {
                while (!st.empty() && T[i] > T[st.top()]) { // 情况三
                    result[st.top()] = i - st.top();
                    st.pop();
                }
                st.push(i);
            }
        }
        return result;
    }
};

时间复杂度:O(n)
空间复杂度:O(n)

版本二:

代码精简如下:

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& T) {
        stack<int> st; // 递增栈
        vector<int> result(T.size(), 0);
        for (int i = 0; i < T.size(); i++) {
            while (!st.empty() && T[i] > T[st.top()]) { // 注意栈不能为空
                result[st.top()] = i - st.top();
                st.pop();
            }
            st.push(i);

        }
        return result;
    }
};

时间复杂度:O(n)
空间复杂度:O(n)

leetcode 496. 下一个更大元素|

题目链接:下一个更大元素|
使用unordered_set作映射,根据数值快速找到下标,并可以判断nums2[i]是否在nums1中出现过。

版本一:

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        stack<int> st;
        vector<int> res(nums1.size(),-1);
        if(nums1.size()==0) return res;
        unordered_map<int,int> umap;  //key:下标元素,value:下标
        for(int i=0;i<nums1.size();i++)
        {
            umap[nums1[i]]=i;
        }
        st.push(0);
        for(int i=1;i<nums2.size();i++){
            if(nums2[i]<nums2[st.top()]){
                st.push(i);
            }else if(nums2[i]==nums2[st.top()]){
                st.push(i);
            }
            else{
                while(!st.empty()&& nums2[i]>nums2[st.top()]){
                    if(umap.count(nums2[st.top()])>0)  //判断map里是否存在整个元素
                    {
                        int index = umap[nums2[st.top()]];  //根据map找到nums2[st.top()]在nums1中的下标
                        res[index]=nums2[i];
                    }
                    st.pop();
                }
                st.push(i);
            }
        }
        return res;
    }
};

版本二

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        stack<int> st;
        vector<int> re(nums1.size(), -1);
        if (nums1.size() == 0) return res;
        unordered_map<int, int> umap; // key:下标元素,value:下标
        for (int i = 0; i < nums1.size(); i++) {
            umap[nums1[i]] = i;
        }
        st.push(0);
        for (int i = 1; i < nums2.size(); i++) {
            while (!st.empty() && nums2[i] > nums2[st.top()]) {
                if (umap.count(nums2[st.top()]) > 0) { // 看map里是否存在这个元素
                    int index = umap[nums2[st.top()]]; // 根据map找到nums2[st.top()] 在 nums1中的下标
                    res[index] = nums2[i];
                }
                st.pop();
            }
            st.push(i);
        }
        return res;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity游戏图形学 Shader结构

shader结构 shader语言 openGL&#xff1a;SLG跨平台 >GLSL&#xff1a;openGL shaderlauguge DX&#xff1a;微软开发&#xff0c;性能很好&#xff0c;但是不能跨平台 >HLSL&#xff1a;high level shader language CG&#xff1a;微软和Nvidia公司联合开发&#xff…

【c++】利用嵌套map创建多层树结构

通常树的深度都大于1&#xff0c;即树有多层&#xff0c;而树结构又可以用c的map容器来实现&#xff0c;所以&#xff0c;本文给出了一种多层树结构的实现思路&#xff0c;同时也给出了相应的c代码。 整体思路概述 首先定义一个节点类Node类&#xff0c;要包括children&#x…

WIndows系统重装、备份与恢复实操问题笔记

一 windows重装 1.1 基本步骤 下载大白菜根据官网使用教程制作启动u盘从MSDN或者微软官网下载Windows镜像根据查询的快捷键进入BIOS系统&#xff0c;设置U盘为第一启动 重装 1.2 Windows 11 激活 微软其实在2023年9月20日的公告中宣布停掉免费升级&#xff0c;数字激活工具…

C++中使用vector保存新建对象中自指指针的问题

问题 在某些场景中&#xff08;例如并查集&#xff09;&#xff0c;我们需要将新建对象中的指针指向对象自己。例如&#xff0c; struct factor {int data;factor* next;factor(int i) : data(i), next(this){} }; 这样的结构体当然没有问题&#xff0c;如果我们想以类似链表…

DolphinScheduler伪集群部署

一.伪集群部署 伪集群部署目的是在单台机器部署 DolphinScheduler 服务&#xff0c;该模式下master、worker、api server、logger server都在同一台机器上。单机版本稳定性较差&#xff0c;官方建议20个以下流程使用。 二.前置需求 &#xff11;、&#xff12;.&#xff10;.…

杨中科 EFCORE 第四部分 命令详解56-61

Migrations 深入研究Migrations 1、使用迁移脚本&#xff0c;可以对当前连接的数据库执行编号更高的迁移&#xff0c;这个操作叫做“向上迁移” (Up)&#xff0c;也可以执行把数据库回退到旧的迁移&#xff0c;这个操作叫“向下迁移(Down&#xff09; 2、除非有特殊需要&…

STM32F103_ESP8266基于RTOS移植MQTT

STM32F103_ESP8266基于RTOS移植MQTT 目录 STM32F103_ESP8266基于RTOS移植MQTT一、准备工作二、移植mqttclient代码三、编译包含mqttclient的工程四、编写ESP8266驱动程序1、ESP8266 AT命令代码框架2、UART硬件和抽象层相关代码3、AT命令发送和解析代码4、plat_sock网络层相关代…

Python+甘特图及标签设置

图示 甘特图代码 import matplotlib.pyplot as plt import numpy as npclass ProjectEmement:def __init__(self, name_, starttime_: float, endtime_: float, fact_endtime_: float, grade_, rootlist_: list, keylist_: list, isover_=-1):self.name = name_self.starttime…

使用VS2015在win7 x64上编译调试FFmpeg(附源码和虚拟机下载)

1. 前言 在文章《使用VS2017在win10 x64上编译调试FFmpeg&#xff08;附源码和虚拟机下载&#xff09;》中&#xff0c;我们在win10VS2017的环境下基于开源项目ShiftMediaProject完成了FFmpeg源码调试环境的配置。在win7VS2015的环境下&#xff0c;ShiftMediaProject配置过程和…

苏州倍丰智能新型雾化粉末技术量产成功!金属3D打印全产业链更进一步

苏州倍丰智能深耕金属3D打印技术领域&#xff0c;以金属3D打印全产业链为目标&#xff0c;围绕金属3D打印设备&#xff0c;涵盖包括金属粉末前后处理设备、金属粉末原材料制备、先进工艺研发等多个领域&#xff0c;完成了一整条自上而下的金属3D打印全产业链。 近日&#xff0c…

计算日期到天数转换

根据输入的日期&#xff0c;计算是这一年的第几天。 保证年份为4位数且日期合法。 本题对三个输入数字依次使用&#xff0c;由年份可得到闰年或平年&#xff0c;故分为两种计算。 在月份中&#xff0c;由于每月天数不好找规律&#xff0c;故分为1—2月&#xff0c;3—7月&am…

苹果手机IOS软件应用IPA砸壳包提取完整教程

我们有很多小伙伴可能想要获取到苹果手机软件的安装包但又不知该如何获取&#xff0c;本文就教你如何获取到IOS软件的IPA砸壳包 首先我们需要准备一台越狱的苹果IOS设备&#xff0c;如果不知如何越狱的可以参考这篇苹果手机越狱教程&#xff1a;https://www.hereitis.cn/artic…

使用setdefault撰写文本索引脚本(出自Fluent Python案例)

背景介绍 由于我们主要介绍撰写脚本的方法&#xff0c;所以用一个简单的文本例子进行分析 a[(19,18),(20,53)] Although[(11,1),(16,1),(18,1)] ambiguity[(14,16)] 以上内容可以保存在一个txt文件中&#xff0c;任务是统计文件中每一个词&#xff08;包括字母&#xff0c;数…

Linux------进程的初步了解

目录 一、什么是进程 二、进程的标识符pid 三、getpid 得到进程的PID 四、kill 终止进程 五、父进程与子进程 六、目录中的进程 一、什么是进程 在windows中&#xff0c;我们查看进程很简单&#xff0c;打开任务管理器&#xff0c;就可以看到在运行的进程。这里我们还可以…

红队专题-反序列化攻击-Tools-Ysoserial

Ysoserial 招募六边形战士队员ysoserial-0.0.6-SNAPSHOT-all.jarysoserial的原生CB1的链CC6链在ysoserial编写自己的payload ysoserial.net前言 参考文章 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 ysoserial-0.0.6-SNAPSHOT-all.ja…

POI-tl 知识整理:整理2 -> 标签

1 文本标签 {{var}} 数据模型&#xff1a; String &#xff1a;文本 TextRenderData &#xff1a;有样式的文本 HyperlinkTextRenderData &#xff1a;超链接和锚点文本 Object &#xff1a;调用 toString() 方法转化为文本 代码示例&#xff1a; Testpublic void testText…

Brc20钱包横评推荐:谁更适合玩铭文?

加密货币的世界越来越热闹&#xff0c;新的创意层出不穷&#xff01;最近&#xff0c;BRC-20 通证标准成了这个圈子的新宠儿&#xff0c;这是在比特币网络上诞生的一种超酷的新型可替代通证。和以太坊的 ERC-20 通证一样牛&#xff0c;但 BRC-20 通证是 Ordinals 协议的杰作&am…

spring boot application yaml key下划线如何转java的Properties对象字段驼峰

spring boot yaml key和value如何映射到Properties对象 下面以MybatisPlusProperties为例 ##java properties 字段驼峰 ##yaml文件如图&#xff0c;key使用下划线 ##java对象驼峰转下划线匹配yaml文件key DataObjectPropertyName.toDashedForm(name);//驼峰转下划线 ##设置P…

ES自动补全

安装IK分词器 要实现根据字母做补全&#xff0c;就必须对文档按照拼音分词。在GitHub上恰好有elasticsearch的拼音分词插件。地址&#xff1a;GitHub - medcl/elasticsearch-analysis-pinyin: This Pinyin Analysis plugin is used to do conversion between Chinese characte…

【神经网络算子】

神经网络算子(1)——DeepONet介绍 AI与PDE&#xff08;三&#xff09;&#xff1a;大概是最好懂的DeepONet模型解析 算子把函数映射为函数。 输入函数u&#xff0c;在固定的sensors上&#xff1a;x_1,x_2,…,x_m。即u(x_i)和y。 输出函数G(u)&#xff0c;在随机的y上。即G(u)(…