代码随想录算法训练营 ---第五十八天

今天开启单调栈的征程。

第一题:

简介:

本题有两种解法,第一种:暴力破解 两层for循环 时间复杂度为O(n^2) 超时了

                             第二种:单调栈解法也是今天的主角。

单调栈是什么?
  • 单调递增栈:单调递增栈就是从栈顶到栈底是从小到大  作用场景:求解某一个在当前数左面或右面第一个大的数
  • 单调递减栈:单调递减栈就是从栈顶到栈底数据是从大到小 作用场景:求解某一个在当前数左面或右面第一个小的数

    单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。

  • 更直白来说,就是用一个栈来记录我们遍历过的元素,因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(这里用单调栈)来记录我们遍历过的元素。

    在使用单调栈的时候首先要明确如下几点:

  • 单调栈里存放的元素是什么?                                                                                                       单调栈里只需要存放元素的下标i就可以了,如果需要使用对应的元素,直接T[i]就可以获取。
  • 单调栈里元素是递增呢? 还是递减呢?
本题思路: 

本题我们使用单调栈,首先是由题意我们要求第一个大的数,所以我们使用单调递增栈。然后我建议大家用草稿纸来模拟一下整个单调栈的运行过程。

 for(int i=1;i<temperatures.size();i++){if(temperatures[i]>temperatures[st.top()]){while(!st.empty() &&temperatures[i]>temperatures[st.top()]){result[st.top()] = i - st.top();st.pop();}st.push(i);}else if(temperatures[i] == temperatures[st.top()]){st.push(i);}else{st.push(i);}}

此代码为遍历过程,大家跟着走一遍就可明白单调栈工作流程。 或者可以去看代码随想路录算法视频跟着卡哥走一遍。

代码实现:

 vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> st;vector<int> result(temperatures.size(),0);st.push(0);for(int i=1;i<temperatures.size();i++){if(temperatures[i]>temperatures[st.top()]){while(!st.empty() &&temperatures[i]>temperatures[st.top()]){result[st.top()] = i - st.top();st.pop();}st.push(i);}else if(temperatures[i] == temperatures[st.top()]){st.push(i);}else{st.push(i);}}return result;}

第二题:

简介:

本题相对于前一题,无太大差别,我们只需在本题中找出nums1中数值 对应 nums2 中的位置即可求出此题,其他代码与上题相同。

代码实现: 

未优化版:
 vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {stack<int> st;vector<int> result(nums2.size(),-1);vector<int> result2;st.push(0);for(int i=1;i<nums2.size();i++){if( nums2[i]>nums2[st.top()]){while(!st.empty() &&nums2[i]>nums2[st.top()]){result[st.top()] = nums2[i];st.pop();}st.push(i);}else if(nums2[i] == nums2[st.top()]){st.push(i);}else{st.push(i);}}for(int i=0;i<nums2.size();i++){cout<<result[i]<<"  ";}for(int i=0;i<nums1.size();i++){for(int j=0;j<nums2.size();j++){if(nums1[i]==nums2[j]){result2.push_back(result[j]);break;}}}return result2;}
优化版:
 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> 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中的下标result[index] = nums2[i];}st.pop();}st.push(i);}}return result;}

总结: 

今天是单调栈的一天,我感觉只要明白单调栈的运行过程,就可以解决问题了。不算太难,继续加油!

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

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

相关文章

卡通渲染总结《三》

接上回 卡通渲染总结《二》的描边技术&#xff0c;接下就是其绘画&#xff08;The Painter&#xff09;的技术。 Painter 的目的是从 3D 模型中生成平面图像。使用这种方法&#xff0c;可以通过改变阴影和高光参数以及着色计算的权重因子来产生各种样式。 阴影部分 单光源 …

PHP中对象数组化

我们在使用ThinkPHP已经Laval框架时&#xff0c;可以像使用数组的方式访问模型对象属性值&#xff0c;为什么我们自己实现的对象却无法通过这种方式访问属性呢&#xff1f;这个功能在PHP中称为对象数组化。 要让一个 PHP 对象可以通过数组方式访问&#xff0c;需要在该对象的类…

docker网络【重点】

一、网络知识 1、桥接模式&#xff1a;用于链接两个不同网络段的设备&#xff0c;是共享通信的一种方式 2、桥接设备&#xff1a;工作在OSI模型的第二层&#xff08;数据链路层&#xff09;。根据MAC地址转发数据帧&#xff0c;类似于交换机&#xff0c;只能转发同一网段&…

状态设计模式

package com.jmj.pattern.state.after;public abstract class LiftState {protected Context context;public void setContext(Context context) {this.context context;}//电梯开启操作public abstract void open();//电梯关闭操作public abstract void close();//电梯运行操…

双目光波导AR眼镜_AR智能眼镜主板PCB定制开发

AR眼镜方案的未来发展潜力非常巨大。随着技术的进步&#xff0c;AR眼镜的光学模块将变得更小巧&#xff0c;像素密度也会增加&#xff0c;实现更高分辨率的画面&#xff0c;甚至能够达到1080P、2K和4K级别的清晰度&#xff0c;从而提升用户的视觉体验。 AR智能眼镜的硬件方面&a…

shell/bash 让vi/vim显示空格,及tab字符

Vim 可以用高亮显示空格和TAB。 文件中有 TAB 键的时候&#xff0c;你是看不见的。要把它显示出来&#xff1a;:set listTAB 键显示为 ^I, $显示在每行的结尾,表示换行&#xff1b;空格仍然显示为空格。:set list 进入List Mode:set nolist 退出List Mode ------------…

河南诗词大会规则和流程

河南省诗词大赛是一场充满诗意的盛会&#xff0c;分为小学组、中学组和社会组。流程包括四个环节&#xff1a;“大浪淘沙” 、“月宫折桂” 、“飞花令”和“诗画南阳”。 比赛前两轮为“大浪淘沙”和“月宫折桂”环节&#xff0c;所有赛手采用平板现场答题&#xff0c;时间为2…

企业培训私有化解决方案PlayEdu

本文应网友 林枫 的要求而折腾&#xff1b; 什么是 PlayEdu &#xff1f; PlayEdu 是一款适用于搭建内部培训平台的开源系统&#xff0c;旨在为企业/机构打造自己品牌的内部培训平台。PlayEdu 基于 Java MySQL 开发&#xff1b;采用前后端分离模式&#xff1b;前端采用 React1…

学习记录---kubernetes中备份和恢复etcd

一、简介 ETCD是kubernetes的重要组成部分&#xff0c;它主要用于存储kubernetes的所有元数据&#xff0c;我们在kubernetes中的所有资源(node、pod、deployment、service等)&#xff0c;如果该组件出现问题&#xff0c;则可能会导致kubernetes无法使用、资源丢失等情况。因此…

git-stash操作

1.保存工作目录中的修改&#xff1a; git stash这个命令将暂存未提交的更改并将工作目录恢复到干净的状态。这些更改可以通过后续的 git stash apply 或 git stash pop 恢复出来。 2.保存修改并添加描述&#xff1a; git stash save "描述"使用此命令&#xff0c;你…

104.进程创建

目录 进程创建相关的函数 获取当前进程的进程ID&#xff08;PID&#xff09; 获取当前进程的父进程ID&#xff08;PPID&#xff09; 创建一个新的进程 fork()剖析 调用格式 创建子进程 子进程与父进程 父子进程执行流 代码演示 进程创建相关的函数 Linux中进程ID为pi…

『亚马逊云科技产品测评』活动征文|AWS云服务器EC2实例实现ByConity快速部署

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 前言 亚马逊是全球最大的在线零售商和云计算服务提供商。AWS云服务器在…

vscode 配置 —— snippets、todo tree

一、snippets snippets 主要用于在进行文件及函数进行注释说明时&#xff0c;一键生成自定义格式注释 使用。 1.1 点击 vscode 设置&#xff0c;选择 User Snippets 1.2 编辑 code-snippets 文件 以C 文件注释为例&#xff0c;文件作用注释 fun_cpp_file.code-snippets &am…

新版IDEA中,module模块无法被识别,类全部变成咖啡杯无法被识

新版IDEA中&#xff0c;module模块无法被识别&#xff0c;类全部变成咖啡杯无法被识 如下图&#xff1a; 解决方法&#xff1a;java的Directory文件没有被设置为根目录&#xff0c;解决方法如下&#xff1a; 这是方法之一&#xff0c;还有很多的原因 可能的原因&#xff1a; …

简单实现Spring容器(二)

阶段2: // 1.编写自己的Spring容器,实现扫描包,得到bean的class对象.2.扫描将 bean 信息封装到 BeanDefinition对象,并放入到Map.思路: 1.将 bean 信息封装到 BeanDefinition对象中,再将其放入到BeanDefinitionMap集合中,集合的结构大概是 key[beanName]–value[beanDefintion…

【C语言】函数递归--输出n的k次方

题目描述&#xff1a; 递归实现n的k次方 代码如下&#xff1a; #include<stdio.h> int nk(int n, int k) {if (k > 0)return n * nk(n, k - 1); } int main() {int ret 0;int n 0;int k 0;scanf("%d", &n);scanf("%d", &k);ret nk(n…

java中用thumbnailator依赖写一个压缩图片的类,只要图片大小超过1M就无线循环下去的详细代码实例?

下面是使用thumbnailator依赖编写的一个压缩图片类的详细代码示例&#xff0c;该类会对大小超过1MB的图片进行无限循环压缩。 java Copy code import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import …

LeetCode 300 最长递增子序列

华为二面出的这个题&#xff0c;非常经典的动态规划题目.... 还是刷题太少了&#xff0c;不然的话应该是能刷到的 针对这道题有一些感悟 1、回溯记忆化搜索动态规划&#xff08;这句话仍然是适用的&#xff09; 回溯本质上是一种暴力解法 可以通过以下两种方式进行时间复杂…

【数据库】树形数据组织架构下的封锁并发控制,B树索引并发访问控制,树协议原理及案例分析

数据库并发访问树协议 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会…

在远程构建git仓库后,本地git仓库建立常用基本操作

这是gitlab新建仓库以后的官方提示&#xff0c;感觉非常有用&#xff1a; 注&#xff1a; 假设项目名称叫 demo1 ssh 路径为&#xff1a;ssh://git10.229.28.94:8081/your_name/demo1.git Command line instructions You can also upload existing files from your computer …