comments | difficulty | edit_url | tags | |||
---|---|---|---|---|---|---|
true |
Medium |
|
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
The problem requires us to find the next greater element for each element. Therefore, we can traverse the array from back to front, which effectively turns the problem into finding the previous greater element. Additionally, since the array is circular, we can traverse the array twice.
Specifically, we start traversing the array from index
After the traversal is complete, we can obtain the array
The time complexity is
class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
n = len(nums)
ans = [-1] * n
stk = []
for i in range(n * 2 - 1, -1, -1):
i %= n
while stk and stk[-1] <= nums[i]:
stk.pop()
if stk:
ans[i] = stk[-1]
stk.append(nums[i])
return ans
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 = n * 2 - 1; i >= 0; --i) {
int j = i % n;
while (!stk.isEmpty() && stk.peek() <= nums[j]) {
stk.pop();
}
if (!stk.isEmpty()) {
ans[j] = stk.peek();
}
stk.push(nums[j]);
}
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 = n * 2 - 1; ~i; --i) {
int j = i % n;
while (stk.size() && stk.top() <= nums[j]) {
stk.pop();
}
if (stk.size()) {
ans[j] = stk.top();
}
stk.push(nums[j]);
}
return ans;
}
};
func nextGreaterElements(nums []int) []int {
n := len(nums)
ans := make([]int, n)
for i := range ans {
ans[i] = -1
}
stk := []int{}
for i := n*2 - 1; i >= 0; i-- {
j := i % n
for len(stk) > 0 && stk[len(stk)-1] <= nums[j] {
stk = stk[:len(stk)-1]
}
if len(stk) > 0 {
ans[j] = stk[len(stk)-1]
}
stk = append(stk, nums[j])
}
return ans
}
function nextGreaterElements(nums: number[]): number[] {
const n = nums.length;
const stk: number[] = [];
const ans: number[] = Array(n).fill(-1);
for (let i = n * 2 - 1; ~i; --i) {
const j = i % n;
while (stk.length && stk.at(-1)! <= nums[j]) {
stk.pop();
}
if (stk.length) {
ans[j] = stk.at(-1)!;
}
stk.push(nums[j]);
}
return ans;
}
/**
* @param {number[]} nums
* @return {number[]}
*/
var nextGreaterElements = function (nums) {
const n = nums.length;
const stk = [];
const ans = Array(n).fill(-1);
for (let i = n * 2 - 1; ~i; --i) {
const j = i % n;
while (stk.length && stk.at(-1) <= nums[j]) {
stk.pop();
}
if (stk.length) {
ans[j] = stk.at(-1);
}
stk.push(nums[j]);
}
return ans;
};