Skip to content

Commit fb821f7

Browse files
authored
feat: update solutions to lc problem: No.0503 (#3153)
No.0503.Next Greater Element II
1 parent 71d12d6 commit fb821f7

13 files changed

+125
-383
lines changed

solution/0500-0599/0503.Next Greater Element II/README.md

+37-132
Original file line numberDiff line numberDiff line change
@@ -56,135 +56,15 @@ tags:
5656

5757
<!-- solution:start -->
5858

59-
### 方法一:单调栈 + 循环数组
59+
### 方法一:单调栈
6060

61-
<!-- tabs:start -->
62-
63-
#### Python3
64-
65-
```python
66-
class Solution:
67-
def nextGreaterElements(self, nums: List[int]) -> List[int]:
68-
n = len(nums)
69-
ans = [-1] * n
70-
stk = []
71-
for i in range(n << 1):
72-
while stk and nums[stk[-1]] < nums[i % n]:
73-
ans[stk.pop()] = nums[i % n]
74-
stk.append(i % n)
75-
return ans
76-
```
77-
78-
#### Java
79-
80-
```java
81-
class Solution {
82-
public int[] nextGreaterElements(int[] nums) {
83-
int n = nums.length;
84-
int[] ans = new int[n];
85-
Arrays.fill(ans, -1);
86-
Deque<Integer> stk = new ArrayDeque<>();
87-
for (int i = 0; i < (n << 1); ++i) {
88-
while (!stk.isEmpty() && nums[stk.peek()] < nums[i % n]) {
89-
ans[stk.pop()] = nums[i % n];
90-
}
91-
stk.push(i % n);
92-
}
93-
return ans;
94-
}
95-
}
96-
```
97-
98-
#### C++
99-
100-
```cpp
101-
class Solution {
102-
public:
103-
vector<int> nextGreaterElements(vector<int>& nums) {
104-
int n = nums.size();
105-
vector<int> ans(n, -1);
106-
stack<int> stk;
107-
for (int i = 0; i < (n << 1); ++i) {
108-
while (!stk.empty() && nums[stk.top()] < nums[i % n]) {
109-
ans[stk.top()] = nums[i % n];
110-
stk.pop();
111-
}
112-
stk.push(i % n);
113-
}
114-
return ans;
115-
}
116-
};
117-
```
118-
119-
#### Go
120-
121-
```go
122-
func nextGreaterElements(nums []int) []int {
123-
n := len(nums)
124-
ans := make([]int, n)
125-
for i := range ans {
126-
ans[i] = -1
127-
}
128-
var stk []int
129-
for i := 0; i < (n << 1); i++ {
130-
for len(stk) > 0 && nums[stk[len(stk)-1]] < nums[i%n] {
131-
ans[stk[len(stk)-1]] = nums[i%n]
132-
stk = stk[:len(stk)-1]
133-
}
134-
stk = append(stk, i%n)
135-
}
136-
return ans
137-
}
138-
```
139-
140-
#### TypeScript
61+
题目需要我们找到每个元素的下一个更大元素,那么我们可以从后往前遍历数组,这样可以将问题为求上一个更大元素。另外,由于数组是循环的,我们可以将数组遍历两次。
14162

142-
```ts
143-
function nextGreaterElements(nums: number[]): number[] {
144-
const stack: number[] = [],
145-
len = nums.length;
146-
const res: number[] = new Array(len).fill(-1);
147-
for (let i = 0; i < 2 * len - 1; i++) {
148-
const j = i % len;
149-
while (stack.length !== 0 && nums[stack[stack.length - 1]] < nums[j]) {
150-
res[stack[stack.length - 1]] = nums[j];
151-
stack.pop();
152-
}
153-
stack.push(j);
154-
}
155-
return res;
156-
}
157-
```
63+
具体地,我们从下标 $n \times 2 - 1$ 开始向前遍历数组,其中 $n$ 是数组的长度。然后,我们记 $j = i \bmod n$,其中 $\bmod$ 表示取模运算。如果栈不为空且栈顶元素小于等于 $nums[j]$,那么我们就不断地弹出栈顶元素,直到栈为空或者栈顶元素大于 $nums[j]$。此时,栈顶元素就是 $nums[j]$ 的上一个更大元素,我们将其赋给 $ans[j]$。最后,我们将 $nums[j]$ 入栈。继续遍历下一个元素。
15864

159-
#### JavaScript
65+
遍历结束后,我们就可以得到数组 $ans$,它是数组 $nums$ 中每个元素的下一个更大元素。
16066

161-
```js
162-
/**
163-
* @param {number[]} nums
164-
* @return {number[]}
165-
*/
166-
var nextGreaterElements = function (nums) {
167-
const n = nums.length;
168-
let stk = [];
169-
let ans = new Array(n).fill(-1);
170-
for (let i = 0; i < n << 1; i++) {
171-
const j = i % n;
172-
while (stk.length && nums[stk[stk.length - 1]] < nums[j]) {
173-
ans[stk.pop()] = nums[j];
174-
}
175-
stk.push(j);
176-
}
177-
return ans;
178-
};
179-
```
180-
181-
<!-- tabs:end -->
182-
183-
<!-- solution:end -->
184-
185-
<!-- solution:start -->
186-
187-
### 方法二
67+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是数组 $nums$ 的长度。
18868

18969
<!-- tabs:start -->
19070

@@ -241,8 +121,12 @@ public:
241121
stack<int> stk;
242122
for (int i = n * 2 - 1; ~i; --i) {
243123
int j = i % n;
244-
while (!stk.empty() && stk.top() <= nums[j]) stk.pop();
245-
if (!stk.empty()) ans[j] = stk.top();
124+
while (stk.size() && stk.top() <= nums[j]) {
125+
stk.pop();
126+
}
127+
if (stk.size()) {
128+
ans[j] = stk.top();
129+
}
246130
stk.push(nums[j]);
247131
}
248132
return ans;
@@ -259,7 +143,7 @@ func nextGreaterElements(nums []int) []int {
259143
for i := range ans {
260144
ans[i] = -1
261145
}
262-
var stk []int
146+
stk := []int{}
263147
for i := n*2 - 1; i >= 0; i-- {
264148
j := i % n
265149
for len(stk) > 0 && stk[len(stk)-1] <= nums[j] {
@@ -274,6 +158,27 @@ func nextGreaterElements(nums []int) []int {
274158
}
275159
```
276160

161+
#### TypeScript
162+
163+
```ts
164+
function nextGreaterElements(nums: number[]): number[] {
165+
const n = nums.length;
166+
const stk: number[] = [];
167+
const ans: number[] = Array(n).fill(-1);
168+
for (let i = n * 2 - 1; ~i; --i) {
169+
const j = i % n;
170+
while (stk.length && stk.at(-1)! <= nums[j]) {
171+
stk.pop();
172+
}
173+
if (stk.length) {
174+
ans[j] = stk.at(-1)!;
175+
}
176+
stk.push(nums[j]);
177+
}
178+
return ans;
179+
}
180+
```
181+
277182
#### JavaScript
278183

279184
```js
@@ -283,15 +188,15 @@ func nextGreaterElements(nums []int) []int {
283188
*/
284189
var nextGreaterElements = function (nums) {
285190
const n = nums.length;
286-
let stk = [];
287-
let ans = new Array(n).fill(-1);
191+
const stk = [];
192+
const ans = Array(n).fill(-1);
288193
for (let i = n * 2 - 1; ~i; --i) {
289194
const j = i % n;
290-
while (stk.length && stk[stk.length - 1] <= nums[j]) {
195+
while (stk.length && stk.at(-1) <= nums[j]) {
291196
stk.pop();
292197
}
293198
if (stk.length) {
294-
ans[j] = stk[stk.length - 1];
199+
ans[j] = stk.at(-1);
295200
}
296201
stk.push(nums[j]);
297202
}

0 commit comments

Comments
 (0)