@@ -56,135 +56,15 @@ tags:
56
56
57
57
<!-- solution:start -->
58
58
59
- ### 方法一:单调栈 + 循环数组
59
+ ### 方法一:单调栈
60
60
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
+ 题目需要我们找到每个元素的下一个更大元素,那么我们可以从后往前遍历数组,这样可以将问题为求上一个更大元素。另外,由于数组是循环的,我们可以将数组遍历两次。
141
62
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] $ 入栈。继续遍历下一个元素。
158
64
159
- #### JavaScript
65
+ 遍历结束后,我们就可以得到数组 $ans$,它是数组 $nums$ 中每个元素的下一个更大元素。
160
66
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$ 的长度。
188
68
189
69
<!-- tabs:start -->
190
70
@@ -241,8 +121,12 @@ public:
241
121
stack<int > stk;
242
122
for (int i = n * 2 - 1; ~ i; --i) {
243
123
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
+ }
246
130
stk.push(nums[ j] );
247
131
}
248
132
return ans;
@@ -259,7 +143,7 @@ func nextGreaterElements(nums []int) []int {
259
143
for i := range ans {
260
144
ans[i] = -1
261
145
}
262
- var stk []int
146
+ stk := []int{}
263
147
for i := n*2 - 1; i >= 0; i-- {
264
148
j := i % n
265
149
for len(stk) > 0 && stk[len(stk)-1] <= nums[j] {
@@ -274,6 +158,27 @@ func nextGreaterElements(nums []int) []int {
274
158
}
275
159
```
276
160
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
+
277
182
#### JavaScript
278
183
279
184
``` js
@@ -283,15 +188,15 @@ func nextGreaterElements(nums []int) []int {
283
188
*/
284
189
var nextGreaterElements = function (nums ) {
285
190
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 );
288
193
for (let i = n * 2 - 1 ; ~ i; -- i) {
289
194
const j = i % n;
290
- while (stk .length && stk[ stk . length - 1 ] <= nums[j]) {
195
+ while (stk .length && stk . at ( - 1 ) <= nums[j]) {
291
196
stk .pop ();
292
197
}
293
198
if (stk .length ) {
294
- ans[j] = stk[ stk . length - 1 ] ;
199
+ ans[j] = stk . at ( - 1 ) ;
295
200
}
296
201
stk .push (nums[j]);
297
202
}
0 commit comments