单调栈 leetcode整理(二)

目录

  • 为什么单调栈的时间复杂度是O(n)
  • 496. 下一个更大元素 I
    • 方法一:暴力
    • 方法二:单调栈+哈希表
  • 739. 每日温度
    • 单调栈模版解
    • 优化
  • 503. 下一个更大元素 II
    • 单调栈+循环遍历

为什么单调栈的时间复杂度是O(n)

尽管for 循环里面还有while 循环,但是里面的while最多执行n次,所以最大执行2n次,即时间复杂度为O(n)。
不能只看有几层循环,因为很多情况下内循环是不执行的,可以这样理解,n个元素每个元素最多进栈一次出栈一次,所以是n

496. 下一个更大元素 I

https://leetcode-cn.com/problems/next-greater-element-i/
给定两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。

nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。

示例 1:

输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,因此输出 -1。
对于num1中的数字1,第二个数组中数字1右边的下一个较大数字是 3。
对于num1中的数字2,第二个数组中没有下一个更大的数字,因此输出 -1。

示例 2:

输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释:
对于 num1 中的数字 2 ,第二个数组中的下一个较大数字是 3 。
对于 num1 中的数字 4 ,第二个数组中没有下一个更大的数字,因此输出 -1 。

方法一:暴力

先找到nums1的数在nums2对应的下标,然后从那个下标开始向右遍历,寻找是否存在。

class Solution {
public:int get_index(vector<int>& nums, int num){for(int i = 0; i < nums.size(); i++){if(num == nums[i]) return i;}return -1;} vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {vector<int> ans(nums1.size());	//答案数组stack<int> st;for(int i = 0; i < nums1.size(); i++){//首先获取nums1[i](当前元素)在nums2数组中的下标int start = get_index(nums2,nums1[i]);int flag = 0;for(; start < nums2.size(); start++){if(nums2[start] > nums1[i]){ans[i] = nums2[start];flag = 1;break;   }}if(flag == 0){ans[i] = -1;}flag = 0;}return ans;}
};

方法二:单调栈+哈希表

先忽略nums1,因为nums1中元素在nums2中一定有。
对nums2进行单调栈处理,需要记录的是一个键值对(该元素,该元素右边第一个比该元素大的元素)。
这个是个典型的单调栈模型:
需要注意:在比较的过程,如果满足st.back() <= nums2[i],就说明nums2[i]是大于栈顶元素的第一个元素(因为我们遍历是向右遍历的)。
经过这个过程后,留在栈中的元素都符合没有找到右边元素大于该元素的条件,所以应该返回-1。

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {vector<int> ans(nums1.size());	//答案数组vector<int> st;map<int,int> hash_map;for(int i = 0; i < nums2.size(); i++){while(!st.empty() && st.back() < nums2[i]){//说明第一个大于栈顶元素的元素为nums2[i]hash_map[st.back()] = nums2[i];st.pop_back();}st.push_back(nums2[i]);}//如果此时栈中还有元素,说明说明呢?//说明栈中的元素在nums2数组中没有在右边找到比它还大的数,所以需要赋值为-1while(!st.empty()){hash_map[st.back()] = -1;st.pop_back();}//将哈希集合中的键值对转换为结果for(int i = 0; i < nums1.size(); i++){ans[i] = hash_map[nums1[i]];}return ans;}
};

739. 每日温度

https://leetcode-cn.com/problems/daily-temperatures/
请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。

单调栈模版解

一开始我使用了两个栈,一个用来存该元素,还有一个用来存该元素的下标,用来计算相差天数,时间复杂度会比较高,也浪费了一些空间。后来发现了只使用一个栈,存下标就行了。

class Solution {
public:vector<int> dailyTemperatures(vector<int>& T) {vector<int> ans(T.size());	//答案数组vector<int> st_index;for(int i = 0; i < T.size(); i++){while(!st_index.empty() && T[st_index.back()] < T[i]){//说明第一个大于栈顶元素的元素为nums2[i]ans[st_index.back()] = (i - st_index.back());st_index.pop_back();}st_index.push_back(i);}//说明栈中的元素在nums2数组中没有在右边找到比它还大的数,所以需要赋值为-1while(!st_index.empty()){ans[st_index.back()] = 0;st_index.pop_back();}return ans;}
};

优化

这一题还有KMP的解法,等看到KMP的知识点再做!贴个链接
https://leetcode-cn.com/problems/daily-temperatures/solution/mei-ri-wen-du-by-leetcode-solution/438101

503. 下一个更大元素 II

https://leetcode-cn.com/problems/next-greater-element-ii/
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。

示例 1:

输入: [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

单调栈+循环遍历

原本next只能在当前元素的右边,现在有可能出现在左边了。
我们可以在原数组后面再接一个原数组,这样就可以完成这样的效果。
另外需要注意的是:对于压栈的元素来说,仍然只是需要压入前n个数,不需要重复将后面链接的数组元素压入。
还需要注意的是:
1、当前元素大于栈顶元素的时候才能进行出栈操作,也就是说,栈中的元素是严格单调递增的,不允许出现等于的情况(这里可能出现重复的元素,所以不能等于)

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {int n = nums.size();vector<int> ans(n,-1);	//答案数组vector<int> st;for(int i = 0; i < 2 * n; i++){while(!st.empty() && nums[st.back()] < nums[i%n]){ans[st.back()] = nums[i%n];st.pop_back();}if(i < n) st.push_back(i);}return ans;}
};

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

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

相关文章

Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法)

ZZ&#xff1a;http://www.blogjava.net/anchor110/articles/355699.html1、在工程下新建lib文件夹&#xff0c;将需要的第三方包拷贝进来。2、将引用的第三方包&#xff0c;添加进工作的build path。3、&#xff08;关键的一步&#xff09;将lib设为源文件夹。如果不设置&…

QTP自传之web常用对象

随着科技的进步&#xff0c;“下载-安装-运行”这经典的三步曲已离我们远去。web应用的高速发展&#xff0c;改变了我们的思维和生活习惯&#xff0c;同时也使web方面的自动化测试越来越重要。今天&#xff0c;介绍一下我对web对象的识别&#xff0c;为以后的对象库编程打下基础…

leetcode中使用c++需要注意的点以及各类容器的初始化、常用成员函数

目录1、传引用2、vector使用初始化方法常用成员函数3、字符串string初始化方法常用成员函数4、哈希表 unordered_map初始化常用成员函数示例&#xff1a;计数器5、哈希集合 unordered_set初始化常用成员函数6、队列 queue初始化成员函数7、栈stack初始化常用成员函数7、emplace…

Linq list 排序,Dictionary 排序

C# 对List成员排序的简单方法 http://blog.csdn.net/wanzhuan2010/article/details/6205884 LINQ之路系列博客导航 http://www.cnblogs.com/lifepoem/archive/2011/12/16/2288017.html 用一句Linq把一个集合的属性值根据条件改了&#xff0c;其他值不变 list去重 list.Where((x…

javascript Ajax 同步请求与异步请求的问题

先来看以下代码&#xff1a; var flagtrue; var index0; $.ajax({url: "http://www.baidu.com/",success: function(data){flagfalse;} }); while(flag){index; } alert(index); 请问最后alert的index的结果是多少&#xff1f; 可能有人会说0呗。实际上却没那么简单…

定义类的Python示例

The task to define a class in Python. 在Python中定义类的任务。 Here, we are defining a class named Number with an attribute num, initializing it with a value 123, then creating two objects N1 and N2 and finally, printing the objects memory locations and a…

十一、线性层

一、Linear Layers torch.nn.Linear(in_features, out_features, biasTrue, deviceNone, dtypeNone) 以VGG神经网络为例&#xff0c;Linear Layers可以将特征图的大小进行变换由(1,1,4096)转换为(1,1,1000) 二、torch.nn.Linear实战 将CIFAR-10数据集中的测试集二维图像[6…

easyui plugin——etreegrid:CRUD Treegrid

昨天写了一个koeasyui的同样的实现&#xff0c;感觉写的太乱&#xff0c;用起来十分麻烦&#xff0c;于是今天照着edatagrid&#xff0c;写了一个etreegrid&#xff0c;这样再用ko绑定就方便多了。 使用很简单,$(tableId).etreegrid({idField:parentIdField:,treeField:,saveUr…

expr

expr在linux中 是一个功能非常强大的命令。通过学习做一个小小的总结。 1、计算字符串的长度。我们可以用awk中的length(s)进行计算。我们 也可以用echo中的echo ${#string}进行计算&#xff0c;当然也可以expr中的expr length $string 求出字符串的长度。举 例[rootlocalhost …

leetcode 42. 接雨水 思考分析(暴力、动态规划、双指针、单调栈)

目录题目思路暴力法动态规划双指针法单调栈题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组…

chdir函数_PHP chdir()函数与示例

chdir函数PHP chdir()函数 (PHP chdir() function) The full form of chdir is "Change Directory", the function chdir() is used to change the current working directory. chdir的完整形式是“更改目录” &#xff0c; 功能chdir()用于更改当前工作目录。 Synt…

十二、Sequential

一、Sequential介绍 torch.nn.Sequential(*args) 由官网给的Example可以大概了解到Sequential是将多层网络进行便捷整合&#xff0c;方便可视化以及简化网络复杂性 二、复现网络模型训练CIFAR-10数据集 这里面有个Hidden units隐藏单元其实就是连个线性层 把隐藏层全部展开整…

1064-快速排序

描述 给定输入排序元素数目n和相应的n个元素&#xff0c;写出程序&#xff0c;利用内排序算法中快速排序算法进行排序&#xff0c;并输出排序最后结果的相应序列。 输入 共两行&#xff0c;第一行给出排序元素数目n&#xff0c;第二行给出n个元素&#xff0c;1≤n≤100000&…

社交问答:取代BBS的Web2.0革命

编者按&#xff1a;本文由乐维UP创始人俞越撰写&#xff0c;你也可以点击这里关注俞越的新浪微博。 BBS在中国的兴起是在95年&#xff0c;之后以惊人的速度发展起来。从2011年开始&#xff0c;国内的问答社区也如当年的BBS一样&#xff0c;大量涌现快速成长&#xff0c;大体分为…

单调栈 leetcode整理(三)

目录42. 接雨水思路分析901. 股票价格跨度思路581. 最短无序连续子数组思路一&#xff1a;排序双指针思路二&#xff1a;单调栈思路三&#xff1a;双指针(最省时)42. 接雨水 42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&…

python 抠图 锯齿_Python | 绘图中的抗锯齿

python 抠图 锯齿Antialiasing is another important feature of Matplotlib and in this article, we will review how to use this functionality. pyplot.antialiased() is an inbuilt function in matplotlib.pyplot which performs our required operation. 抗锯齿是Matpl…

apk 反编译

引用&#xff1a;http://code.google.com/p/dex2jar/issues/detail?id20 最新版:dex2jar http://code.google.com/p/dex2jar/downloads/list 错误&#xff1a;http://code.google.com/p/dex2jar/issues/detail?id20 这段时间在学Android应用开发&#xff0c;在想既然是用Jav…

OpenDiscussion_DataDrivenDesign

本文源于公司内部技术交流&#xff0c;如有不当之处&#xff0c;还请指正。 Content&#xff1a; 1. What is Data-driven design?2. WPF revolution.3. More about ObservableCollection.4. Question.1. What is Data-driven design?Data-driven design: is a design of usi…

十三、Loss Functions

一、Loss Functions损失函数 损失函数的作用&#xff1a; 1&#xff0c;损失函数就是实际输出值和目标值之间的差 2&#xff0c;由这个差便可以通过反向传播对之后的数据进行更新 Loss Functions官网给的API 里面由很多种损失函数&#xff0c;不同的损失函数有其不同的用途及表…

leetcode 滑动窗口小结 (一)

目录小结以及代码框架76. 最小覆盖子串滑动窗口代码以及注释567. 字符串的排列滑动窗口438. 找到字符串中所有字母异位词3. 无重复字符的最长子串化简框架reference小结以及代码框架 滑动窗口技巧属于双指针技巧。 该算法的思路为维护一个窗口&#xff0c;不断滑动&#xff0c…