Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

feat: add solutions to lc problem: No.0739 #3802

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
196 changes: 68 additions & 128 deletions solution/0700-0799/0739.Daily Temperatures/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,21 +59,13 @@ tags:

### 方法一:单调栈

单调栈常见模型:找出每个数左/右边**离它最近的**且**比它大/小的数**。模板:
本题需要我们找出每个元素右边第一个比它大的元素的位置,这是一个典型的单调栈应用场景。

```python
stk = []
for i in range(n):
while stk and check(stk[-1], i):
stk.pop()
stk.append(i)
```
我们从右往左遍历数组 $\textit{temperatures}$,维护一个从栈顶到栈底温度单调递增的栈 $\textit{stk}$,栈中存储的是数组元素的下标。对于每个元素 $\textit{temperatures}[i]$,我们不断将其与栈顶元素进行比较,如果栈顶元素对应的温度小于等于 $\textit{temperatures}[i]$,那么循环将栈顶元素弹出,直到栈为空或者栈顶元素对应的温度大于 $\textit{temperatures}[i]$。此时,栈顶元素就是右边第一个比 $\textit{temperatures}[i]$ 大的元素,距离为 $\textit{stk.top()} - i$,我们更新答案数组。然后将 $\textit{temperatures}[i]$ 入栈,继续遍历。

对于本题,我们需要找出每个数右边**离它最近的**且**比它大的数**,因此我们可以从右往左遍历数组,且需要维护一个从栈底到栈顶单调递减的栈
遍历结束后,返回答案数组即可

对于当前遍历到的数 `temperatures[i]`,如果栈顶元素 `temperatures[stk[-1]]` 小于等于 `temperatures[i]`,则弹出栈顶元素,直到栈为空或者栈顶元素大于 `temperatures[i]`。如果此时栈不为空,那么栈顶元素就是 `temperatures[i]` 右边离它最近的且比它大的数,更新 `ans[i] = stk[-1] - i`。接着,我们将 $i$ 入栈,继续遍历下一个数。

时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为 `temperatures` 数组的长度。
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 $\textit{temperatures}$ 的长度。

<!-- tabs:start -->

Expand All @@ -82,12 +74,14 @@ for i in range(n):
```python
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
ans = [0] * len(temperatures)
stk = []
for i, t in enumerate(temperatures):
while stk and temperatures[stk[-1]] < t:
j = stk.pop()
ans[j] = i - j
n = len(temperatures)
ans = [0] * n
for i in range(n - 1, -1, -1):
while stk and temperatures[stk[-1]] <= temperatures[i]:
stk.pop()
if stk:
ans[i] = stk[-1] - i
stk.append(i)
return ans
```
Expand All @@ -98,12 +92,14 @@ class Solution:
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int n = temperatures.length;
int[] ans = new int[n];
Deque<Integer> stk = new ArrayDeque<>();
for (int i = 0; i < n; ++i) {
while (!stk.isEmpty() && temperatures[stk.peek()] < temperatures[i]) {
int j = stk.pop();
ans[j] = i - j;
int[] ans = new int[n];
for (int i = n - 1; i >= 0; --i) {
while (!stk.isEmpty() && temperatures[stk.peek()] <= temperatures[i]) {
stk.pop();
}
if (!stk.isEmpty()) {
ans[i] = stk.peek() - i;
}
stk.push(i);
}
Expand All @@ -119,13 +115,15 @@ class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
vector<int> ans(n);
stack<int> stk;
for (int i = 0; i < n; ++i) {
while (!stk.empty() && temperatures[stk.top()] < temperatures[i]) {
ans[stk.top()] = i - stk.top();
vector<int> ans(n);
for (int i = n - 1; ~i; --i) {
while (!stk.empty() && temperatures[stk.top()] <= temperatures[i]) {
stk.pop();
}
if (!stk.empty()) {
ans[i] = stk.top() - i;
}
stk.push(i);
}
return ans;
Expand All @@ -137,14 +135,16 @@ public:

```go
func dailyTemperatures(temperatures []int) []int {
ans := make([]int, len(temperatures))
var stk []int
for i, t := range temperatures {
for len(stk) > 0 && temperatures[stk[len(stk)-1]] < t {
j := stk[len(stk)-1]
ans[j] = i - j
n := len(temperatures)
ans := make([]int, n)
stk := []int{}
for i := n - 1; i >= 0; i-- {
for len(stk) > 0 && temperatures[stk[len(stk)-1]] <= temperatures[i] {
stk = stk[:len(stk)-1]
}
if len(stk) > 0 {
ans[i] = stk[len(stk)-1] - i
}
stk = append(stk, i)
}
return ans
Expand All @@ -156,14 +156,14 @@ func dailyTemperatures(temperatures []int) []int {
```ts
function dailyTemperatures(temperatures: number[]): number[] {
const n = temperatures.length;
const ans = new Array(n).fill(0);
const ans: number[] = Array(n).fill(0);
const stk: number[] = [];
for (let i = n - 1; i >= 0; --i) {
while (stk.length && temperatures[stk[stk.length - 1]] <= temperatures[i]) {
for (let i = n - 1; ~i; --i) {
while (stk.length && temperatures[stk.at(-1)!] <= temperatures[i]) {
stk.pop();
}
if (stk.length) {
ans[i] = stk[stk.length - 1] - i;
ans[i] = stk.at(-1)! - i;
}
stk.push(i);
}
Expand Down Expand Up @@ -191,6 +191,34 @@ impl Solution {
}
```

#### Rust

```rust
impl Solution {
pub fn daily_temperatures(temperatures: Vec<i32>) -> Vec<i32> {
let n = temperatures.len();
let mut stk: Vec<usize> = Vec::new();
let mut ans = vec![0; n];

for i in (0..n).rev() {
while let Some(&top) = stk.last() {
if temperatures[top] <= temperatures[i] {
stk.pop();
} else {
break;
}
}
if let Some(&top) = stk.last() {
ans[i] = (top - i) as i32;
}
stk.push(i);
}

ans
}
}
```

#### JavaScript

```js
Expand All @@ -200,14 +228,14 @@ impl Solution {
*/
var dailyTemperatures = function (temperatures) {
const n = temperatures.length;
const ans = new Array(n).fill(0);
const ans = Array(n).fill(0);
const stk = [];
for (let i = n - 1; i >= 0; --i) {
while (stk.length && temperatures[stk[stk.length - 1]] <= temperatures[i]) {
for (let i = n - 1; ~i; --i) {
while (stk.length && temperatures[stk.at(-1)] <= temperatures[i]) {
stk.pop();
}
if (stk.length) {
ans[i] = stk[stk.length - 1] - i;
ans[i] = stk.at(-1) - i;
}
stk.push(i);
}
Expand All @@ -219,92 +247,4 @@ var dailyTemperatures = function (temperatures) {

<!-- solution:end -->

<!-- solution:start -->

### 方法二

<!-- tabs:start -->

#### Python3

```python
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
n = len(temperatures)
stk = []
ans = [0] * n
for i in range(n - 1, -1, -1):
while stk and temperatures[stk[-1]] <= temperatures[i]:
stk.pop()
if stk:
ans[i] = stk[-1] - i
stk.append(i)
return ans
```

#### Java

```java
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int n = temperatures.length;
Deque<Integer> stk = new ArrayDeque<>();
int[] ans = new int[n];
for (int i = n - 1; i >= 0; --i) {
while (!stk.isEmpty() && temperatures[stk.peek()] <= temperatures[i]) {
stk.pop();
}
if (!stk.isEmpty()) {
ans[i] = stk.peek() - i;
}
stk.push(i);
}
return ans;
}
}
```

#### C++

```cpp
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
vector<int> ans(n);
stack<int> stk;
for (int i = n - 1; ~i; --i) {
while (!stk.empty() && temperatures[stk.top()] <= temperatures[i]) stk.pop();
if (!stk.empty()) ans[i] = stk.top() - i;
stk.push(i);
}
return ans;
}
};
```

#### Go

```go
func dailyTemperatures(temperatures []int) []int {
n := len(temperatures)
ans := make([]int, n)
var stk []int
for i := n - 1; i >= 0; i-- {
for len(stk) > 0 && temperatures[stk[len(stk)-1]] <= temperatures[i] {
stk = stk[:len(stk)-1]
}
if len(stk) > 0 {
ans[i] = stk[len(stk)-1] - i
}
stk = append(stk, i)
}
return ans
}
```

<!-- tabs:end -->

<!-- solution:end -->

<!-- problem:end -->
Loading
Loading