【力扣】503. 下一个更大元素 II
给定一个循环数组 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 <= nums.length <=
1
0
4
10^4
104
-
1
0
9
10^9
109 <= nums[i] <=
1
0
9
10^9
109文章来源:https://www.toymoban.com/news/detail-657737.html
题解
此题在每日温度的基础上,成为了循环数组而已
只需在遍历数组时遍历2倍length,i 使用取余就可以。 【力扣】739. 每日温度文章来源地址https://www.toymoban.com/news/detail-657737.html
import java.util.Arrays;
import java.util.Stack;
public class Solution {
public static int[] nextGreaterElements(int[] nums) {
//边界判断
if(nums == null || nums.length <= 1) {
return new int[]{-1};
}
int[] result = new int[nums.length];
// 初始化
Arrays.fill(result, -1);
// 栈中存放的是数组的下标
Stack<Integer> stack = new Stack<>();
//先放入第一个元素下标
stack.push(0);
// 循环数组,扩大遍历的边界条件,按2倍数组遍历
for (int i = 1; i < 2 * nums.length ; i++) {
// 大于数组长度的时候取余
int j = i % nums.length;
//情况1:小于
if (nums[j] < nums[stack.peek()]) {
stack.push(j);
}
//情况2:等于
else if (nums[j] == nums[stack.peek()]) {
stack.push(j);
}
//情况3:大于
else {
while (!stack.isEmpty() && (nums[j] > nums[stack.peek()])) {
result[stack.peek()] = nums[j];
stack.pop();
}
stack.push(j);
}
}
return result;
}
}
到了这里,关于【力扣】503. 下一个更大元素 II <单调栈>的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!