@@ -59,21 +59,13 @@ tags:
59
59
60
60
### 方法一:单调栈
61
61
62
- 单调栈常见模型:找出每个数左/右边 ** 离它最近的 ** 且 ** 比它大/小的数 ** 。模板:
62
+ 本题需要我们找出每个元素右边第一个比它大的元素的位置,这是一个典型的单调栈应用场景。
63
63
64
- ``` python
65
- stk = []
66
- for i in range (n):
67
- while stk and check(stk[- 1 ], i):
68
- stk.pop()
69
- stk.append(i)
70
- ```
64
+ 我们从右往左遍历数组 $\textit{temperatures}$,维护一个从栈顶到栈底温度单调递增的栈 $\textit{stk}$,栈中存储的是数组元素的下标。对于每个元素 $\textit{temperatures}[ i] $,我们不断将其与栈顶元素进行比较,如果栈顶元素对应的温度小于等于 $\textit{temperatures}[ i] $,那么循环将栈顶元素弹出,直到栈为空或者栈顶元素对应的温度大于 $\textit{temperatures}[ i] $。此时,栈顶元素就是右边第一个比 $\textit{temperatures}[ i] $ 大的元素,距离为 $\textit{stk.top()} - i$,我们更新答案数组。然后将 $\textit{temperatures}[ i] $ 入栈,继续遍历。
71
65
72
- 对于本题,我们需要找出每个数右边 ** 离它最近的 ** 且 ** 比它大的数 ** ,因此我们可以从右往左遍历数组,且需要维护一个从栈底到栈顶单调递减的栈 。
66
+ 遍历结束后,返回答案数组即可 。
73
67
74
- 对于当前遍历到的数 ` temperatures[i] ` ,如果栈顶元素 ` temperatures[stk[-1]] ` 小于等于 ` temperatures[i] ` ,则弹出栈顶元素,直到栈为空或者栈顶元素大于 ` temperatures[i] ` 。如果此时栈不为空,那么栈顶元素就是 ` temperatures[i] ` 右边离它最近的且比它大的数,更新 ` ans[i] = stk[-1] - i ` 。接着,我们将 $i$ 入栈,继续遍历下一个数。
75
-
76
- 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为 ` temperatures ` 数组的长度。
68
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 $\textit{temperatures}$ 的长度。
77
69
78
70
<!-- tabs:start -->
79
71
@@ -82,12 +74,14 @@ for i in range(n):
82
74
``` python
83
75
class Solution :
84
76
def dailyTemperatures (self , temperatures : List[int ]) -> List[int ]:
85
- ans = [0 ] * len (temperatures)
86
77
stk = []
87
- for i, t in enumerate (temperatures):
88
- while stk and temperatures[stk[- 1 ]] < t:
89
- j = stk.pop()
90
- ans[j] = i - j
78
+ n = len (temperatures)
79
+ ans = [0 ] * n
80
+ for i in range (n - 1 , - 1 , - 1 ):
81
+ while stk and temperatures[stk[- 1 ]] <= temperatures[i]:
82
+ stk.pop()
83
+ if stk:
84
+ ans[i] = stk[- 1 ] - i
91
85
stk.append(i)
92
86
return ans
93
87
```
@@ -98,12 +92,14 @@ class Solution:
98
92
class Solution {
99
93
public int [] dailyTemperatures (int [] temperatures ) {
100
94
int n = temperatures. length;
101
- int [] ans = new int [n];
102
95
Deque<Integer > stk = new ArrayDeque<> ();
103
- for (int i = 0 ; i < n; ++ i) {
104
- while (! stk. isEmpty() && temperatures[stk. peek()] < temperatures[i]) {
105
- int j = stk. pop();
106
- ans[j] = i - j;
96
+ int [] ans = new int [n];
97
+ for (int i = n - 1 ; i >= 0 ; -- i) {
98
+ while (! stk. isEmpty() && temperatures[stk. peek()] <= temperatures[i]) {
99
+ stk. pop();
100
+ }
101
+ if (! stk. isEmpty()) {
102
+ ans[i] = stk. peek() - i;
107
103
}
108
104
stk. push(i);
109
105
}
@@ -119,13 +115,15 @@ class Solution {
119
115
public:
120
116
vector<int > dailyTemperatures(vector<int >& temperatures) {
121
117
int n = temperatures.size();
122
- vector<int > ans(n);
123
118
stack<int > stk;
124
- for ( int i = 0; i < n; ++i) {
125
- while (!stk.empty() && temperatures [ stk.top() ] < temperatures [ i ] ) {
126
- ans [ stk.top()] = i - stk.top();
119
+ vector< int > ans(n);
120
+ for (int i = n - 1; ~ i; --i ) {
121
+ while (!stk.empty() && temperatures [ stk.top()] <= temperatures [ i ] ) {
127
122
stk.pop();
128
123
}
124
+ if (!stk.empty()) {
125
+ ans[ i] = stk.top() - i;
126
+ }
129
127
stk.push(i);
130
128
}
131
129
return ans;
@@ -137,14 +135,16 @@ public:
137
135
138
136
```go
139
137
func dailyTemperatures(temperatures []int) []int {
140
- ans := make([]int, len(temperatures))
141
- var stk []int
142
- for i, t := range temperatures {
143
- for len(stk) > 0 && temperatures[stk[len(stk)-1]] < t {
144
- j := stk[len(stk)-1]
145
- ans[j] = i - j
138
+ n := len(temperatures)
139
+ ans := make([]int, n)
140
+ stk := []int{}
141
+ for i := n - 1; i >= 0; i-- {
142
+ for len(stk) > 0 && temperatures[stk[len(stk)-1]] <= temperatures[i] {
146
143
stk = stk[:len(stk)-1]
147
144
}
145
+ if len(stk) > 0 {
146
+ ans[i] = stk[len(stk)-1] - i
147
+ }
148
148
stk = append(stk, i)
149
149
}
150
150
return ans
@@ -156,14 +156,14 @@ func dailyTemperatures(temperatures []int) []int {
156
156
``` ts
157
157
function dailyTemperatures(temperatures : number []): number [] {
158
158
const n = temperatures .length ;
159
- const ans = new Array (n ).fill (0 );
159
+ const ans: number [] = Array (n ).fill (0 );
160
160
const stk: number [] = [];
161
- for (let i = n - 1 ; i >= 0 ; -- i ) {
162
- while (stk .length && temperatures [stk [ stk . length - 1 ] ] <= temperatures [i ]) {
161
+ for (let i = n - 1 ; ~ i ; -- i ) {
162
+ while (stk .length && temperatures [stk . at ( - 1 ) ! ] <= temperatures [i ]) {
163
163
stk .pop ();
164
164
}
165
165
if (stk .length ) {
166
- ans [i ] = stk [ stk . length - 1 ] - i ;
166
+ ans [i ] = stk . at ( - 1 ) ! - i ;
167
167
}
168
168
stk .push (i );
169
169
}
@@ -191,6 +191,34 @@ impl Solution {
191
191
}
192
192
```
193
193
194
+ #### Rust
195
+
196
+ ``` rust
197
+ impl Solution {
198
+ pub fn daily_temperatures (temperatures : Vec <i32 >) -> Vec <i32 > {
199
+ let n = temperatures . len ();
200
+ let mut stk : Vec <usize > = Vec :: new ();
201
+ let mut ans = vec! [0 ; n ];
202
+
203
+ for i in (0 .. n ). rev () {
204
+ while let Some (& top ) = stk . last () {
205
+ if temperatures [top ] <= temperatures [i ] {
206
+ stk . pop ();
207
+ } else {
208
+ break ;
209
+ }
210
+ }
211
+ if let Some (& top ) = stk . last () {
212
+ ans [i ] = (top - i ) as i32 ;
213
+ }
214
+ stk . push (i );
215
+ }
216
+
217
+ ans
218
+ }
219
+ }
220
+ ```
221
+
194
222
#### JavaScript
195
223
196
224
``` js
@@ -200,14 +228,14 @@ impl Solution {
200
228
*/
201
229
var dailyTemperatures = function (temperatures ) {
202
230
const n = temperatures .length ;
203
- const ans = new Array (n).fill (0 );
231
+ const ans = Array (n).fill (0 );
204
232
const stk = [];
205
- for (let i = n - 1 ; i >= 0 ; -- i) {
206
- while (stk .length && temperatures[stk[ stk . length - 1 ] ] <= temperatures[i]) {
233
+ for (let i = n - 1 ; ~ i ; -- i) {
234
+ while (stk .length && temperatures[stk . at ( - 1 ) ] <= temperatures[i]) {
207
235
stk .pop ();
208
236
}
209
237
if (stk .length ) {
210
- ans[i] = stk[ stk . length - 1 ] - i;
238
+ ans[i] = stk . at ( - 1 ) - i;
211
239
}
212
240
stk .push (i);
213
241
}
@@ -219,92 +247,4 @@ var dailyTemperatures = function (temperatures) {
219
247
220
248
<!-- solution: end -->
221
249
222
- <!-- solution: start -->
223
-
224
- ### 方法二
225
-
226
- <!-- tabs: start -->
227
-
228
- #### Python3
229
-
230
- ``` python
231
- class Solution :
232
- def dailyTemperatures (self , temperatures : List[int ]) -> List[int ]:
233
- n = len (temperatures)
234
- stk = []
235
- ans = [0 ] * n
236
- for i in range (n - 1 , - 1 , - 1 ):
237
- while stk and temperatures[stk[- 1 ]] <= temperatures[i]:
238
- stk.pop()
239
- if stk:
240
- ans[i] = stk[- 1 ] - i
241
- stk.append(i)
242
- return ans
243
- ```
244
-
245
- #### Java
246
-
247
- ``` java
248
- class Solution {
249
- public int [] dailyTemperatures (int [] temperatures ) {
250
- int n = temperatures. length;
251
- Deque<Integer > stk = new ArrayDeque<> ();
252
- int [] ans = new int [n];
253
- for (int i = n - 1 ; i >= 0 ; -- i) {
254
- while (! stk. isEmpty() && temperatures[stk. peek()] <= temperatures[i]) {
255
- stk. pop();
256
- }
257
- if (! stk. isEmpty()) {
258
- ans[i] = stk. peek() - i;
259
- }
260
- stk. push(i);
261
- }
262
- return ans;
263
- }
264
- }
265
- ```
266
-
267
- #### C++
268
-
269
- ``` cpp
270
- class Solution {
271
- public:
272
- vector<int > dailyTemperatures(vector<int >& temperatures) {
273
- int n = temperatures.size();
274
- vector<int > ans(n);
275
- stack<int > stk;
276
- for (int i = n - 1; ~ i; --i) {
277
- while (!stk.empty() && temperatures[ stk.top()] <= temperatures[ i] ) stk.pop();
278
- if (!stk.empty()) ans[ i] = stk.top() - i;
279
- stk.push(i);
280
- }
281
- return ans;
282
- }
283
- };
284
- ```
285
-
286
- #### Go
287
-
288
- ```go
289
- func dailyTemperatures(temperatures []int) []int {
290
- n := len(temperatures)
291
- ans := make([]int, n)
292
- var stk []int
293
- for i := n - 1; i >= 0; i-- {
294
- for len(stk) > 0 && temperatures[stk[len(stk)-1]] <= temperatures[i] {
295
- stk = stk[:len(stk)-1]
296
- }
297
- if len(stk) > 0 {
298
- ans[i] = stk[len(stk)-1] - i
299
- }
300
- stk = append(stk, i)
301
- }
302
- return ans
303
- }
304
- ```
305
-
306
- <!-- tabs: end -->
307
-
308
- <!-- solution: end -->
309
-
310
250
<!-- problem: end -->
0 commit comments