【力扣】503. 下一个更大元素 II <单调栈>

【力扣】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

题解

此题在每日温度的基础上,成为了循环数组而已
只需在遍历数组时遍历2倍length,i 使用取余就可以。 【力扣】739. 每日温度

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;
    }
}

你可能感兴趣的:(力扣及OJ,#,栈,队列,单调栈,leetcode,算法,数据结构)