algorithm-base/animation-simulation/单调队列单调栈/leetcode739每日温度.md
2021-07-29 02:33:38 +00:00

84 lines
3.3 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

> 如果阅读时发现错误或者动画不可以显示的问题可以添加我微信好友 **[tan45du_one](https://raw.githubusercontent.com/tan45du/tan45du.github.io/master/个人微信.15egrcgqd94w.jpg)** ,备注 github + 题目 + 问题 向我反馈
>
> 感谢支持该仓库会一直维护希望对各位有一丢丢帮助
>
> 另外希望手机阅读的同学可以来我的 <u>[**公众号袁厨的算法小屋**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
#### [739. 每日温度](https://leetcode-cn.com/problems/daily-temperatures/)
题目描述
> 请根据每日 气温 列表重新生成一个列表对应位置的输出为要想观测到更高的气温至少需要等待的天数如果气温在这之后都不会升高请在该位置用 0 来代替
示例 1
> 输入 temperatures = [73, 74, 75, 71, 69, 72, 76, 73]
>
> 输出arr = [1, 1, 4, 2, 1, 1, 0, 0]
示例 2
> 输入temperatures = [30,30,31,45,31,34,56]
>
> 输出arr = [2,1,1,3,1,1,0]
#### 题目解析
其实我们可以换种方式理解这个题目比如我们 temperatures[0] = 30,则我们需要找到后面第一个比 30 大的数也就是 3131 的下标为 230 的下标为 0 则我们的返回数组 arr[0] = 2
理解了题目之后我们来说一下解题思路
遍历数组数组中的值为待入栈元素待入栈元素入栈时会先跟栈顶元素进行对比如果小于该值则入栈如果大于则将栈顶元素出栈新的元素入栈
例如栈顶为 69新的元素为 72 69 出栈72 入栈并赋值给 arr69 的索引为 472 的索引为 5 arr[4] = 5 - 4 = 1这个题目用到的是单调栈的思想下面我们来看一下视频解析
![](https://img-blog.csdnimg.cn/20210319163137996.gif)
栈中的括号内的值代表索引对应的元素我们的入栈的为索引值为了便于理解将其对应的值写在了括号中
```java
class Solution {
public int[] dailyTemperatures(int[] T) {
int len = T.length;
if (len == 0) {
return T;
}
Stack<Integer> stack = new Stack<>();
int[] arr = new int[len];
int t = 0;
for (int i = 0; i < len; i++) {
//单调栈
while (!stack.isEmpty() && T[i] > T[stack.peek()]){
arr[stack.peek()] = i - stack.pop();
}
stack.push(i);
}
return arr;
}
}
```
GO Code:
```go
func dailyTemperatures(temperatures []int) []int {
l := len(temperatures)
if l == 0 {
return temperatures
}
stack := []int{}
arr := make([]int, l)
for i := 0; i < l; i++ {
for len(stack) != 0 && temperatures[i] > temperatures[stack[len(stack) - 1]] {
idx := stack[len(stack) - 1]
arr[idx] = i - idx
stack = stack[: len(stack) - 1]
}
// 栈保存的是索引
stack = append(stack, i)
}
return arr
}
```