【题目描述】
给定一个循环数组 nums
( nums[nums.length - 1]
的下一个元素是 nums[0]
),返回 nums
中每个元素的 下一个更大元素 。
数字 x
的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1
。
https://leetcode.cn/problems/next-greater-element-ii/
【示例】
【代码】admin
思路:如何解决循环数组的情况,就是要再次复制前n-1个元素,新数组的长度是2n-1 ; 需要考虑 {5,4,3,2,1} 这种特殊场景
package com.company;
import java.util.Arrays;
import java.util.Stack;
// 2022-02-16
class Solution {
public int[] nextGreaterElements(int[] nums) {
int len = nums.length;
// 至少要再复制 n-1个字符
int[] arr = new int[2 * len - 1];
System.arraycopy(nums, 0, arr, 0, len);
System.arraycopy(nums, 0, arr, len, len - 1);
int[] res = new int[len];
// 全部赋值为-1
Arrays.fill(res, -1);
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < arr.length; i++){
while (!stack.isEmpty() && arr[i] > arr[stack.peek()]) {
int pre = stack.pop();
res[pre % len] = arr[i]; // 这里要取余
}
stack.push(i);
}
// System.out.println(Arrays.toString(res));
return res;
}
}
public class Test {
public static void main(String[] args) {
new Solution().nextGreaterElements(new int[] {1,2,1}); // 输出: [2,-1,2]
new Solution().nextGreaterElements(new int[] {1,2,3,4,3}); // 输出: [2,3,4,-1,4]
new Solution().nextGreaterElements(new int[] {5,4,3,2,1}); // 输出: [-1,5,5,5,5]
}
}
【代码】leecode
思路: 数组长度 2n -1 , 下标用取余的计算
package com.company;
import java.util.Arrays;
import java.util.Stack;
// 2022-02-16
class Solution {
public int[] nextGreaterElements(int[] nums) {
int len = nums.length;
int[] res = new int[len];
// 全部赋值为-1
Arrays.fill(res, -1);
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < 2 * len - 1; i++){
while (!stack.isEmpty() && nums[i % len] > nums[stack.peek()]) {
int pre = stack.pop();
res[pre % len] = nums[i % len]; // 这里要取余
}
stack.push(i % len); // 要取余
}
System.out.println(Arrays.toString(res));
return res;
}
}
public class Test {
public static void main(String[] args) {
new Solution().nextGreaterElements(new int[] {1,2,1}); // 输出: [2,-1,2]
new Solution().nextGreaterElements(new int[] {1,2,3,4,3}); // 输出: [2,3,4,-1,4]
new Solution().nextGreaterElements(new int[] {5,4,3,2,1}); // 输出: [-1,5,5,5,5]
}
}