最近做每日一题,逐渐的有感觉了,虽然原题没做过,但是基本能想到其他题目类似的解法来解决不同的问题。比如这道题。
题干如下:

这一题要求下一个更大的元素,并且是当成循环数组来处理,所以,答案数组中,只可能最大的数没有下一个更大的数,其他的数都应该存在下一个更大的数。读完题目,立马想到一道类似的题:每日温度,解法也随之想到:单调栈!
经过调试之后,修改完所有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 下一个更大的元素 (单调栈)相关推荐

  1. Java实现 LeetCode 503 下一个更大元素 II

    503. 下一个更大元素 II 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大 ...

  2. leetcode 503. 下一个更大元素 II(单调栈)

    给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它 ...

  3. leetcode 503. 下一个更大元素 II

    给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它 ...

  4. LeetCode 1019. 链表中的下一个更大节点(单调栈)

    1. 题目 给出一个以头节点 head 作为第一个节点的链表.链表中的节点分别编号为:node_1, node_2, node_3, - . 每个节点都可能有下一个更大值(next larger va ...

  5. 503. 下一个更大元素 II

    503. 下一个更大元素 II 题目 我的解答 分析 解答 官方解法 题目 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是 ...

  6. LeetCode 496. 下一个更大元素 I(哈希)

    1. 题目 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x ...

  7. 496. 下一个更大元素 I/503. 下一个更大元素 II/739. 每日温度

    2020-05-10 1.题目描述 下一个更大元素 2.题解 1.直接进行暴力搜索 2.既然题目的标签是栈,就应该用到栈先进后出的特性,参考了官方的题解之后,我认为最能体现这种 特性的就是要找到下一个 ...

  8. LeetCode 496. 下一个更大元素 I

    599. 两个列表的最小索引总和 添加链接描述 假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和 ...

  9. LeetCode 496. 下一个更大元素 I 解题思路及C++实现

    解题思路: 因为这两个int型的vector中不包含重复元素,所以考虑使用c++中的unordered_map,对num2进行遍历,找到每一个元素的下一个更大元素,这样的话,时间复杂度就是O(n). ...

最新文章

  1. 【topoSort拓扑排序】1424. 奖金(简单题目看拓扑排序)
  2. Marketing Cloud API消费entity unsupported format错误消息的处理
  3. android tcp判断服务器是否断开,Android tcp客户端连接,然后从java服务器断开连接...
  4. MySQL到MsSQL的迁移工具——SSMA
  5. GCD 信号量控制并发 (dispatch_semaphore)
  6. Android LitePal
  7. 【HDU1284 中南林业大学第十一届校赛 B:】兑换零钱(dp)
  8. CentOS 下安装配置mongodb
  9. dft的matlab实现,DFT的matlab实现
  10. 关于交流半波与全波整流输出的电压(或电流)有效值和平均值的讨论
  11. Java之约瑟夫环问题
  12. mac制作linux启动盘,Mac 下制作开机启动盘,做了一个Centos7 的系统U盘
  13. 【JoJo的摄影笔记】黎明女神的呼唤—— 佳能王朝霸业崛起
  14. IOS 使用itms-services协议,服务端安装应用
  15. New 900 Sentences
  16. 51Nod1584 加权约数和-题解
  17. 传统行业如何“玩”大数据?
  18. python基础循环语句
  19. C语言入门之变量、常量、字符串、转义字符
  20. 【大数据分析常用算法】6.共同好友

热门文章

  1. Anaconda中用pip安装本地包
  2. CryptoKitties谜恋猫同台公有链MagnaChain,CJ发声畅谈游戏生态
  3. July《十五个经典算法研究与总结》目录+索引
  4. NR 5G 无线直放站(IAB)架构
  5. JDK9-17新特性
  6. Vs2017 激活密钥与下载
  7. SQL,SP与ORM
  8. 了解抖音中视频审核机制,视频如何发才会有流量呢?
  9. matlab怎么绘制李萨如图形_matlab研究李萨如图形
  10. 修复电脑图片文件图标不显示的方法