Welcome to Subscribe On Youtube
Formatted question description: https://leetcode.ca/all/503.html
503. Next Greater Element II (Medium)
Given a circular array (the next element of the last element is the first element of the array), print the Next Greater Number for every element. 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, output -1 for this number.
Example 1:
Input: [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.
Note: The length of given array won't exceed 10000.
Related Topics:
Stack
Similar Questions:
Solution 1. Monotonic stack
// OJ: https://leetcode.com/problems/next-greater-element-ii/
// Time: O(N)
// Space: O(N)
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& A) {
stack<int> s;
int N = A.size();
vector<int> ans(N, -1);
for (int i = 0; i < 2 * N; ++i) {
int n = A[i % N];
while (s.size() && A[s.top()] < n) {
ans[s.top()] = n;
s.pop();
}
s.push(i % N);
}
return ans;
}
};
-
class Solution { public int[] nextGreaterElements(int[] nums) { int length = nums.length; List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < length; i++) list.add(nums[i]); int[] nextGreaterElements = new int[length]; for (int i = 0; i < length; i++) nextGreaterElements[i] = -1; Stack<Integer> stack = new Stack<Integer>(); Stack<Integer> indicesStack = new Stack<Integer>(); for (int i = 0; i < length; i++) { int num = nums[i]; while (!stack.isEmpty() && stack.peek() < num) { int prevNum = stack.pop(); int index = indicesStack.pop(); nextGreaterElements[index] = num; } stack.push(num); indicesStack.push(i); } for (int i = 0; i < length; i++) { int num = nums[i]; while (!stack.isEmpty() && stack.peek() < num) { int prevNum = stack.pop(); int index = indicesStack.pop(); nextGreaterElements[index] = num; } stack.push(num); indicesStack.push(i); } return nextGreaterElements; } } ############ 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; } }
-
// OJ: https://leetcode.com/problems/next-greater-element-ii/ // Time: O(N) // Space: O(N) class Solution { public: vector<int> nextGreaterElements(vector<int>& A) { stack<int> s; int N = A.size(); vector<int> ans(N, -1); for (int i = 0; i < 2 * N; ++i) { int n = A[i % N]; while (s.size() && A[s.top()] < n) { ans[s.top()] = n; s.pop(); } s.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 ############ class Solution(object): def nextGreaterElements(self, nums): """ :type nums: List[int] :rtype: List[int] """ ans = [-1] * len(nums) n = len(nums) stack = [] nums *= 2 for i, num in enumerate(nums): while stack and nums[stack[-1]] < num: top = stack.pop() if top < n: ans[top] = num stack.append(i) 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; };