LeetCode 503 下一个更大的元素 (单调栈)
最近做每日一题,逐渐的有感觉了,虽然原题没做过,但是基本能想到其他题目类似的解法来解决不同的问题。比如这道题。
题干如下:
这一题要求下一个更大的元素,并且是当成循环数组来处理,所以,答案数组中,只可能最大的数没有下一个更大的数,其他的数都应该存在下一个更大的数。读完题目,立马想到一道类似的题:每日温度,解法也随之想到:单调栈!
经过调试之后,修改完所有BUG,提交成功,代码如下:
class Solution {public: //自己做出来的方法,单调栈,类似每日温度那题vector<int> nextGreaterElements(vector<int>& nums) {int n = nums.size();stack<int> sta; //单调栈vector<int> ans(n,-1); //答案数组for(int i = 0;i<n;i++){while(!sta.empty()&&nums[i] > nums[sta.top()]){ //单调栈核心代码ans[sta.top()] = nums[i];sta.pop();}sta.push(i);}while(sta.empty()!=1){ //队列中还剩的元素,代表后面没有比他们大的元素,所以需要返回去找 int x = sta.top();for(int i = 1;i<n;i++){int t = x+i;if(nums[t%n] > nums[x]){ans[x] = nums[t%n];break;}}sta.pop();}return ans;}
};
做完了自然要去看看官方解法,看了官方的解法之后,发觉自己的智商又被官方题解给碾压了,这也是为什么要写下这片文章的原因:记录下好的解法。
在我的解法中,一次遍历完之后,肯定有没有找到下一个更大的元素的数组元素,一种可能是它本身就是最大的,另外一种就是它更大的元素在它的前面,所以这里需要返回开头,重新寻找,我的解法导致我的时间复杂度并没有完全达到单调栈O(n)的效率,当所有算数都一样的时候,我的时间复杂度就会降低到O(N2)。但是官方解法就不会,先来看看官方题解是怎么做的。
class Solution {public: //官方解法vector<int> nextGreaterElements(vector<int>& nums) {int n = nums.size();vector<int> ans(n,-1);stack<int> sta; //单调栈for(int i = 0;i<2*n-1;i++){while(sta.empty()!=1&&nums[sta.top()] < nums[i%n]){ans[sta.top()] = nums[i%n];sta.pop();}sta.push(i%n);}return ans;}
};
官方解法让我直呼太赞了。看来我还是没有掌握单调栈的精髓啊,单调栈还可以这么用,既然要用单调栈就用到底!
所以,你大爷终究是你大爷,学到了…
LeetCode 503 下一个更大的元素 (单调栈)相关推荐
- Java实现 LeetCode 503 下一个更大元素 II
503. 下一个更大元素 II 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大 ...
- leetcode 503. 下一个更大元素 II(单调栈)
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它 ...
- leetcode 503. 下一个更大元素 II
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它 ...
- LeetCode 1019. 链表中的下一个更大节点(单调栈)
1. 题目 给出一个以头节点 head 作为第一个节点的链表.链表中的节点分别编号为:node_1, node_2, node_3, - . 每个节点都可能有下一个更大值(next larger va ...
- 503. 下一个更大元素 II
503. 下一个更大元素 II 题目 我的解答 分析 解答 官方解法 题目 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是 ...
- LeetCode 496. 下一个更大元素 I(哈希)
1. 题目 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x ...
- 496. 下一个更大元素 I/503. 下一个更大元素 II/739. 每日温度
2020-05-10 1.题目描述 下一个更大元素 2.题解 1.直接进行暴力搜索 2.既然题目的标签是栈,就应该用到栈先进后出的特性,参考了官方的题解之后,我认为最能体现这种 特性的就是要找到下一个 ...
- LeetCode 496. 下一个更大元素 I
599. 两个列表的最小索引总和 添加链接描述 假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和 ...
- LeetCode 496. 下一个更大元素 I 解题思路及C++实现
解题思路: 因为这两个int型的vector中不包含重复元素,所以考虑使用c++中的unordered_map,对num2进行遍历,找到每一个元素的下一个更大元素,这样的话,时间复杂度就是O(n). ...
最新文章
- 【topoSort拓扑排序】1424. 奖金(简单题目看拓扑排序)
- Marketing Cloud API消费entity unsupported format错误消息的处理
- android tcp判断服务器是否断开,Android tcp客户端连接,然后从java服务器断开连接...
- MySQL到MsSQL的迁移工具——SSMA
- GCD 信号量控制并发 (dispatch_semaphore)
- Android LitePal
- 【HDU1284 中南林业大学第十一届校赛 B:】兑换零钱(dp)
- CentOS 下安装配置mongodb
- dft的matlab实现,DFT的matlab实现
- 关于交流半波与全波整流输出的电压(或电流)有效值和平均值的讨论
- Java之约瑟夫环问题
- mac制作linux启动盘,Mac 下制作开机启动盘,做了一个Centos7 的系统U盘
- 【JoJo的摄影笔记】黎明女神的呼唤—— 佳能王朝霸业崛起
- IOS 使用itms-services协议,服务端安装应用
- New 900 Sentences
- 51Nod1584 加权约数和-题解
- 传统行业如何“玩”大数据?
- python基础循环语句
- C语言入门之变量、常量、字符串、转义字符
- 【大数据分析常用算法】6.共同好友