@@ -59,21 +59,13 @@ tags:
5959
6060### 方法一:单调栈
6161
62- 单调栈常见模型:找出每个数左/右边 ** 离它最近的 ** 且 ** 比它大/小的数 ** 。模板:
62+ 本题需要我们找出每个元素右边第一个比它大的元素的位置,这是一个典型的单调栈应用场景。
6363
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] $ 入栈,继续遍历。
7165
72- 对于本题,我们需要找出每个数右边 ** 离它最近的 ** 且 ** 比它大的数 ** ,因此我们可以从右往左遍历数组,且需要维护一个从栈底到栈顶单调递减的栈 。
66+ 遍历结束后,返回答案数组即可 。
7367
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}$ 的长度。
7769
7870<!-- tabs:start -->
7971
@@ -82,12 +74,14 @@ for i in range(n):
8274``` python
8375class Solution :
8476 def dailyTemperatures (self , temperatures : List[int ]) -> List[int ]:
85- ans = [0 ] * len (temperatures)
8677 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
9185 stk.append(i)
9286 return ans
9387```
@@ -98,12 +92,14 @@ class Solution:
9892class Solution {
9993 public int [] dailyTemperatures (int [] temperatures ) {
10094 int n = temperatures. length;
101- int [] ans = new int [n];
10295 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;
107103 }
108104 stk. push(i);
109105 }
@@ -119,13 +115,15 @@ class Solution {
119115public:
120116 vector<int > dailyTemperatures(vector<int >& temperatures) {
121117 int n = temperatures.size();
122- vector<int > ans(n);
123118 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 ] ) {
127122 stk.pop();
128123 }
124+ if (!stk.empty()) {
125+ ans[ i] = stk.top() - i;
126+ }
129127 stk.push(i);
130128 }
131129 return ans;
@@ -137,14 +135,16 @@ public:
137135
138136```go
139137func 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] {
146143 stk = stk[:len(stk)-1]
147144 }
145+ if len(stk) > 0 {
146+ ans[i] = stk[len(stk)-1] - i
147+ }
148148 stk = append(stk, i)
149149 }
150150 return ans
@@ -156,14 +156,14 @@ func dailyTemperatures(temperatures []int) []int {
156156``` ts
157157function dailyTemperatures(temperatures : number []): number [] {
158158 const n = temperatures .length ;
159- const ans = new Array (n ).fill (0 );
159+ const ans: number [] = Array (n ).fill (0 );
160160 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 ]) {
163163 stk .pop ();
164164 }
165165 if (stk .length ) {
166- ans [i ] = stk [ stk . length - 1 ] - i ;
166+ ans [i ] = stk . at ( - 1 ) ! - i ;
167167 }
168168 stk .push (i );
169169 }
@@ -191,6 +191,34 @@ impl Solution {
191191}
192192```
193193
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+
194222#### JavaScript
195223
196224``` js
@@ -200,14 +228,14 @@ impl Solution {
200228 */
201229var dailyTemperatures = function (temperatures ) {
202230 const n = temperatures .length ;
203- const ans = new Array (n).fill (0 );
231+ const ans = Array (n).fill (0 );
204232 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]) {
207235 stk .pop ();
208236 }
209237 if (stk .length ) {
210- ans[i] = stk[ stk . length - 1 ] - i;
238+ ans[i] = stk . at ( - 1 ) - i;
211239 }
212240 stk .push (i);
213241 }
@@ -219,92 +247,4 @@ var dailyTemperatures = function (temperatures) {
219247
220248<!-- solution: end -->
221249
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-
310250<!-- problem: end -->
0 commit comments