Skip to content

Commit e7db871

Browse files
authored
feat: add solutions to lc problem: No.0739 (#3802)
No.0739.Daily Temperatures
1 parent 6454943 commit e7db871

File tree

13 files changed

+184
-350
lines changed

13 files changed

+184
-350
lines changed

solution/0700-0799/0739.Daily Temperatures/README.md

+68-128
Original file line numberDiff line numberDiff line change
@@ -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
8375
class 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:
9892
class 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 {
119115
public:
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
139137
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] {
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
157157
function 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
*/
201229
var 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

Comments
 (0)