代码随想录算法训练营第六十二天 | 739.每日温度、496.下一个更大元素 I、503.下一个更大元素II

news2024/11/24 5:02:39

739.每日温度

文字讲解:代码随想录

视频讲解:单调栈,你该了解的,这里都讲了!LeetCode:739.每日温度_哔哩哔哩_bilibili

解题思路

思路一:暴力双循环

O(n^2)

思路二:单调栈(用来找到右边或者左边第一个比它大的元素)

元素:利用一个栈来存下标i,用T[i]来做映射

顺序(递增还是递减):如果是递增是求左边或者右边第一个比它大的元素

否则就是求比它小的元素

作用:用一个单调栈来记录我们遍历过哪些元素

使用:用当前元素和栈口元素进行比较

T[i] > T[st.top()]

此时找到了第一个比它大的元素 记录结果result[st.top()] 结果下标一定是栈顶元素下标

因为结果已经记录了,栈顶元素就没用了,直接弹出st.pop(),并push(i)

T[i] < T[st.top()] 

那么就加入到栈中,这样从栈口到栈顶就是单调递增的

T[i] == T[st.top()]

也加入到栈中

过程模拟

首先先将第一个遍历元素加入单调栈

加入T[1] = 74,因为T[1] > T[0](当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况)。

我们要保持一个递增单调栈(从栈头到栈底),所以将T[0]弹出,T[1]加入,此时result数组可以记录了,result[0] = 1,即T[0]右面第一个比T[0]大的元素是T[1]。

加入T[2],同理,T[1]弹出

加入T[3],T[3] < T[2] (当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况),加T[3]加入单调栈。

这样就不难看出为什么result要使用栈顶元素下标,以及递增单调栈的处理过程和比较过程

如果元素遍历完后一直在栈里,那就是默认为0,没有找到比他大的情况

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        stack<int> st;
        vector<int> result(temperatures.size(),0);
        if(temperatures.size()==1) return result;
        st.push(0);     //放入第一个遍历的元素
        for(int i = 1 ;i < temperatures.size() ; i++)
        {
              if(temperatures[i]<temperatures[st.top()])  //小于当前栈顶元素
              st.push(i);
              else if(temperatures[i] == temperatures[st.top()])
              st.push(i);
              else
              {
                    while(!st.empty() && temperatures[i]>temperatures[st.top()]) //要循环去判断,可能比栈里元素都大
                    {
                            result[st.top()] = i - st.top();
                            st.pop();
                    }
                    st.push(i);     //直到没有比他大的,就加入到栈中
              }
        }
        return result;
    }
};

496.下一个更大元素 I

文字讲解:代码随想录

视频讲解:单调栈,套上一个壳子就有点绕了| LeetCode:496.下一个更大元素_哔哩哔哩_bilibili

解题思路

1.先定义一个result数组,大小是nums1的大小,默认为-1

2.单调栈遍历的是num2,我们要在哪里找比他大的元素的,就在哪里用单调栈遍历

3.建立nums1和nums2的关系,用哈希来建立映射,nums2中的元素是否在nums1中出现过,如果出现过,要找到nums1中对应的下标

4.本题要找第一个大的,因此用递增栈

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
            stack<int> st;
            vector<int> result(nums1.size(),-1);
            if(nums1.size()==0) return result;
            unordered_map<int,int> map;
            for(int i = 0 ;i < nums1.size() ;i++) map[ nums1[i] ] = i ;   //用元素的数值去找到在nums1中对应的下标
            //num1和num2和桥梁是元素的值,因此作为key
            st.push(0);
            for(int i = 0 ;i < nums2.size(); i++)
            {
                if(nums2[i] < nums2[st.top()] || nums2[i]==nums2[st.top()])
                 st.push(i);
                else
                {
                    while(!st.empty() && nums2[i]>nums2[st.top()])
                    {
                            if( map.find(nums2[st.top()])!= map.end() )   //栈顶元素是nums1中的数
                            {
                                    int index = map[ nums2[ st.top() ] ];
                                    result[ index ] = nums2[i];
                            }
                            st.pop();
                                
                    }
                    st.push(i);
                }
            }
            return result;
    }
};

503.下一个更大元素II

文字讲解:代码随想录

视频讲解:单调栈,成环了可怎么办?LeetCode:503.下一个更大元素II_哔哩哔哩_bilibili

解题思路:

本题是环形

思路一:再开辟一个一样的数组,拼接起来,然后用新数组做一个单调栈,最后取前三个值

思路二:环形或者首尾相连的通法就是取模

for(int i = 0 ; i < nums.size() * 2 ; i ++)

                i % nums.size()

剩下的就是模版了

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
            vector<int> result(nums.size(),-1);
            stack<int> st;
            st.push(0);
            for(int i = 1 ; i<nums.size()*2; i++)
            {
                 if(nums[i % nums.size()]<nums[st.top()] || nums[i % nums.size()]==nums[st.top()])
                 st.push(i % nums.size());   //小于等于,就加入单调
                 else
                 {
                    while(!st.empty() && nums[st.top()] < nums[i % nums.size()])
                    {
                        result[st.top()] = nums[i % nums.size()];
                        st.pop();
                    }
                    st.push(i % nums.size());
                 }
            }
            return result;
    }
};

常见疑惑

循环判断两遍后,是否会被覆盖?

并不会

例如 432432

结果 -1 4 4 -1 -1 -1

到第二次4之后的23都是在栈里的

此时栈是234,因此不会覆盖

例如234234

结果 3 4 -1 3 4 -1

此时从最后一个4更新第一遍的3的结果后,栈就不会更新元素了

此时栈是 4 3 2 4 

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

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

相关文章

医学人工智能项目如何申请基金?

小罗碎碎念 本期推文面向的群体 青年教师有志硕博/博后 尤其适合一直认真追小罗推文的老师/同学&#xff0c;你们会发现自己在看这篇推文的时候&#xff0c;遇到自己领域的项目时&#xff0c;文思如泉涌&#xff0c;仿佛马上就能把本子写好&#xff0c;哈哈。&#xff08;运用…

phpStudy安装sqli-labs

phpStudy安装sqli-labs git地址&#xff1a;https://github.com/Audi-1/sqli-labs 点击管理–>根目录 将git下载的sqli-labs文件放进去并解压 进入sql-connections修改 修改db-creds.inc文件为自己数据库的账号密码 更改php版本为5.*&#xff0c;因为这个程序只能在php 5.…

MacOS之Rosetta技术的引入

提示&#xff1a;宝子们&#xff0c;希望文章对你们有所帮助&#xff0c; 请一键三连支持博主下吧&#xff5e; 文章目录 前言一、Rosetta 是什么&#xff1f;二、关于安装Rosetta三、关于Rosetta的问题分享总结 前言 博主的个人开发环境和配置说明&#xff1a; MacOS Montere…

保险丝选取

保险丝 1、保险丝的电压要≥输入最大电压 2、确定外形尺寸 3、确定外形尺寸安全标志如UL、IEC等 4、确定最小额定电流 5、确定I^2t 电压额定值 (Voltage Ratings)&#xff1a; 保险丝的电压额定值必须大于或者等于断开电路的最大电压。由于保险丝的阻值非常低&#xff0c…

[Qt的学习日常]--常用控件1

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、什么是控…

Vue49-props属性

一、当同一个组件标签被使用多次 因为data属性写的是函数形式&#xff01; 二、需求&#xff1a;老王也想用<Student>组件&#xff0c;但是需要动态把老王想要的值传进来。 2-1、使用props属性接收参数 使用props属性&#xff0c;接收的这三个参数&#xff0c;是被保存在…

笔记 | 用go写个docker

仅作为自己学习过程的记录&#xff0c;不具备参考价值 前言 看到一段非常有意思的话&#xff1a; 很多人刚接触docker的时候就会感觉非常神奇&#xff0c;感觉这个技术非常新颖&#xff0c;其实并不然&#xff0c;docker使用到的技术都是之前已经存在过的&#xff0c;只不过旧…

【笔记】为什么不同硬件的1T实际硬盘容量硬盘是954GB或者931GB?

问题描述 不管是电脑还是移动硬盘&#xff0c;厂家描述的1T硬盘容量都不是计算机知识领域内真正的1T大小&#xff0c;硬盘容量实际是小于1TB的。 另外还发现对于1TB的不同厂家设备有着实际不同的磁盘容量&#xff0c;比如为什么有的1T电脑硬盘是954GB&#xff0c;而移动硬盘是…

点云传统算法

1 滤波&#xff0c;过滤噪点&#xff0c;下采样 统计滤波&#xff1a; voxel&#xff0c; 半径搜索&#xff1a; # 基于体素网格化的滤波器 voxel_down_pcd cloud.voxel_down_sample(voxel_size0.5)# 基于半径搜索的滤波器 cl, ind cloud.remove_statistical_outlier(nb_ne…

【数据结构】三路快速排序

1. 简介 传统快速排序用的是双路快速排序&#xff0c;即将大于基准值的部分放到基准值右侧&#xff0c;小于基准值的部分放到基准值左侧&#xff0c;但是这种算法面对过多的重复数据的数组&#xff0c;时间复杂度会增多&#xff0c;于是就有了三路快速排序的思想&#xff0c;其…

【AI实践】Ollama本地安装大模型服务

Ollama安装运行 安装与配置 Download Ollama 安装默认在C盘&#xff0c;成功后&#xff0c;window任务栏图标会有Ollama Logo 为了不占用C盘更大的空间&#xff0c;修改模型下载路径&#xff0c;修改环境变量 下载模型 由于我电脑是第六代Intel&#xff0c;集显&#xff0c;…

北斗三代一体式数传终端短报文

北斗三代一体式数传终端短报文M20C-V30针对船载通信和导航应用推出的一款支持北斗 RDSS/RNSS 功能的船载一体机。北斗数传终端内部集成了北斗多频天线、射频、基带以及主控等功能单元&#xff0c;可实现 RDSS 定位、短报文通信和 RNSS 导航定位等功能。M20C-V30型北斗数传终端体…

万事开头难——Java实现俄罗斯小方块【第一步】

目录 技术实现&#xff1a; 1.初始化游戏窗口&#xff1b; 1.1 什么是窗口&#xff1a; 1.2 Swing 1.3 JFrame创建窗口&#xff1a; 1.3.1创建窗口的逻辑 1.3.2.设置简单的页面 1.3.3.优化 1.3.4.设置标题 1.4 创建游戏窗口 技术实现&#xff1a; 1.初始化游戏窗口&am…

「茶桁 AI 秘籍-CV 篇」预告

Hi, 大家好。 我是茶桁。 咱们的《茶桁的 AI 秘籍》系列距离上一个系列课程《人工智能 BI 核心》已经有一段时间了&#xff0c;终于有时间可以写 CV 部分的课程&#xff0c;主要也是最近一段时间我确实有点忙不过来。 那么咱们 CV 的课程会有一些变化&#xff0c;就是会改为收…

Spring MVC详解(上)

一、Spring MVC初步认识 1.1介绍 Spring MVC是Spring Framework提供的Web组件&#xff0c;全称是Spring Web MVC,是目前主流的实现MVC设计模式的框架&#xff0c;提供前端路由映射、视图解析等功能 Java Web开发者必须要掌握的技术框架 1.2MVC是什么 MVC是一种软件架构思想…

如何区分人工智能生成的图像与真实照片(下)

4 功能上的不合理性 AI 生成的图像往往会因为缺乏对现实世界物体结构和相互作用的了解&#xff0c;而产生各种功能不合理之处。这些不合理之处主要表现在以下几个方面&#xff1a; 4.1 构图不合理 物体关系不合逻辑: AI 生成的图像中&#xff0c;物体和人物之间的关系可能不符…

Sigir2024 ranking相关论文速读

简单浏览一下Sigir2024中与ranking相关的论文。不得不说&#xff0c;自从LLM大热后&#xff0c;传统的LTR方向的论文是越来越少了&#xff0c;目前不少都是RAG或类似场景下的工作了&#xff0c;比如查询改写、rerank等。 文章目录 The Surprising Effectiveness of Rankers Tr…

MySQL查询练习题1.平均工资2.查询各部门的总薪水3.查询总薪水排名第二的部门4.查询姓名重复的员工信息5.查询各部门薪水大于900的男性员工的平均薪水

创建一个员工表emp&#xff0c;包含字段&#xff1a;姓名name&#xff0c;性别sex&#xff0c;部门depart&#xff0c;工资salary create table emp(name varchar(30) not null,sex varchar(30) not null,depart int not null,salary int not null); 插入数据打印为 mysql>…

AtCoder Beginner Contest 358 A~E(F,G更新中...)

A.Welcome to AtCoder Land 题意 给出两个字符串 S , T S, T S,T&#xff0c;请你判断是否满足&#xff1a; 字符串 S S S为AtCoder 字符串 T T T为Land 分析 输入后判断即可 代码 #include<bits/stdc.h> using namespace std; void solve() {string s, t;cin &g…

HumanPlus——斯坦福ALOHA团队开源的人形机器人:先影子学习技术收集数据,后上模仿学习和RL

前言 今天只是一个平常的日子&#xff0c;不过看到了两篇文章 一篇是《半年冒出近百家新公司&#xff0c;「具身智能」也有春天》 我看完之后转发到朋友圈&#xff0c;并评论道&#xff1a;让机器人翻一万个后空翻&#xff0c;不如让机器人打好一个螺钉&#xff0c;毕竟在目前阶…