单调栈求解算法
给定一个循环数组 nums
( nums[nums.length - 1]
的下一个元素是 nums[0]
),返回 nums
中每个元素的 下一个更大元素 。
数字 x
的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1
。
示例 1:
输入: nums = [1,2,1] 输出: [2,-1,2] 解释: 第一个 1 的下一个更大的数是 2; 数字 2 找不到下一个更大的数; 第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
示例 2:
输入: nums = [1,2,3,4,3] 输出: [2,3,4,-1,4]
求解:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class NUM_503 { public int [] nextGreaterElements( int [] nums) { // 1、创建一个栈 Stack<Integer> stack = new Stack<>(); int len = nums.length; // 2、创建一个保存结果的数组 int [] ret = new int [len]; for ( int i = 2 * len - 1 ; i >= 0 ; i--) { while (!stack.isEmpty() && stack.peek() <= nums[i % len]) { stack.pop(); // 当前元素比栈顶元素小,就出栈, } ret[i % len] = stack.isEmpty() ? - 1 : stack.peek(); stack.push(nums[i % len]); } return ret; } } |
解析:
此题和一般的单调栈相比,数组是一个循环数组,和一般的相比只需要让循环的长度变成2倍的数组长度即可
1、下一个最大元元素,找当前元素右边的元素,所以倒着遍历数组
2、找当前元素左边最小的元素,就正着遍历数组
3、一个栈+一个while循环
为啥倒着遍历:
例如,2,4,3,5,6,7,1
输出:5 5 5 7 -1 -1
倒着遍历:1的下一个元素,没有,故-1;
7的下一个元素为1,故-1,把7入栈
对于6而言,6比7小,故6对应的7
5比6小,所以是6;
3比5小,对应3的结果就是5;
当遍历到4时,栈的元素是3,4比3大,所以要把3出栈,原因很简单:因为4比3大,3没有必要存在栈中,因为下一个元素如果以4为最大元素,那肯定不会遍历到3,如果不以4为最大元素,那肯定也不会以3为最大元素
关键点就是:
1 | while (!stack.isEmpty() && stack.peek() <= nums[i % len]) |
如果找数组中,左边第一个比他小的数,只需要正向遍历,修改while中的条件即可
本文来自博客园,作者:{Justin_Hu},转载请注明原文链接:{https://www.cnblogs.com/gchenghu/}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!