Welcome to Subscribe On Youtube
503. Next Greater Element II
Description
Given a circular integer array nums
(i.e., the next element of nums[nums.length - 1]
is nums[0]
), return the next greater number for every element in nums
.
The next greater number of a number x
is the first greater number to its traversing-order next in the array, which means you could search circularly to find its next greater number. If it doesn't exist, return -1
for this number.
Example 1:
Input: nums = [1,2,1] Output: [2,-1,2] Explanation: The first 1's next greater number is 2; The number 2 can't find next greater number. The second 1's next greater number needs to search circularly, which is also 2.
Example 2:
Input: nums = [1,2,3,4,3] Output: [2,3,4,-1,4]
Constraints:
1 <= nums.length <= 104
-109 <= nums[i] <= 109
Solutions
-
class Solution { public int[] nextGreaterElements(int[] nums) { int n = nums.length; int[] ans = new int[n]; Arrays.fill(ans, -1); Deque<Integer> stk = new ArrayDeque<>(); for (int i = 0; i < (n << 1); ++i) { while (!stk.isEmpty() && nums[stk.peek()] < nums[i % n]) { ans[stk.pop()] = nums[i % n]; } stk.push(i % n); } return ans; } }
-
class Solution { public: vector<int> nextGreaterElements(vector<int>& nums) { int n = nums.size(); vector<int> ans(n, -1); stack<int> stk; for (int i = 0; i < (n << 1); ++i) { while (!stk.empty() && nums[stk.top()] < nums[i % n]) { ans[stk.top()] = nums[i % n]; stk.pop(); } stk.push(i % n); } return ans; } };
-
class Solution: def nextGreaterElements(self, nums: List[int]) -> List[int]: n = len(nums) ans = [-1] * n stk = [] for i in range(n << 1): while stk and nums[stk[-1]] < nums[i % n]: ans[stk.pop()] = nums[i % n] stk.append(i % n) return ans
-
func nextGreaterElements(nums []int) []int { n := len(nums) ans := make([]int, n) for i := range ans { ans[i] = -1 } var stk []int for i := 0; i < (n << 1); i++ { for len(stk) > 0 && nums[stk[len(stk)-1]] < nums[i%n] { ans[stk[len(stk)-1]] = nums[i%n] stk = stk[:len(stk)-1] } stk = append(stk, i%n) } return ans }
-
function nextGreaterElements(nums: number[]): number[] { const stack: number[] = [], len = nums.length; const res: number[] = new Array(len).fill(-1); for (let i = 0; i < 2 * len - 1; i++) { const j = i % len; while (stack.length !== 0 && nums[stack[stack.length - 1]] < nums[j]) { res[stack[stack.length - 1]] = nums[j]; stack.pop(); } stack.push(j); } return res; }
-
/** * @param {number[]} nums * @return {number[]} */ var nextGreaterElements = function (nums) { const n = nums.length; let stk = []; let ans = new Array(n).fill(-1); for (let i = 0; i < n << 1; i++) { const j = i % n; while (stk.length && nums[stk[stk.length - 1]] < nums[j]) { ans[stk.pop()] = nums[j]; } stk.push(j); } return ans; };