给定一个循环数组 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]
求解:
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为最大元素
关键点就是:
while (!stack.isEmpty() && stack.peek() <= nums[i % len])
如果找数组中,左边第一个比他小的数,只需要正向遍历,修改while中的条件即可
标签:遍历,nums,int,元素,算法,求解,数组,stack,单调 From: https://www.cnblogs.com/gchenghu/p/17916190.html