739-每日温度

739-每日温度

力扣735

https://leetcode-cn.com/problems/daily-temperatures/submissions/

自从上次做了最大矩形单调栈题目之后,最近笔试见了两题单调栈的题目了,心理作用??赶紧补吧…

题目描述的不是很清楚(可以看英文版比较明白),总之,是说往后找到比当前大的(温度高的),然后记录下标距离。

很显然是单调栈的题目:”往后找到第一个”这样的字样

思路也比较简单:

  • 往后找第一个比当前大的,因此采用递减栈。
  • 栈中记录下标(因为要求的是下标差而且通过下标可以直接在T[i]中得出值作比较反之则困难,好多单调栈的题目都是这样记录的)
  • 遇到比栈顶大则记录当前与栈顶元素的距离,出栈,循环直至满足递减栈
  • 当前元素入栈。

java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class seven_three_nine_每日温度 {

@Test
public void test(){
int[] T = {73, 74, 75, 71, 69, 72, 76, 73};
int[] res = dailyTemperatures(T);
System.out.println(Arrays.toString(res));
}

public int[] dailyTemperatures(int[] T) {
int[] res = new int[T.length];
if (T == null || T.length == 0) return res;
Deque<Integer> deque = new ArrayDeque<>(); //栈中存下标而不是值,值通过T[下标]得出
deque.offerLast(0);
for (int i = 1; i < T.length; i++) {
if (T[i] <= T[deque.peekLast()]){ //满足递减栈,当前下标直接入栈
deque.offerLast(i);
}else {
//不满足,出栈,记录距离,循环直至满足单调栈
while (deque.size() != 0 && T[i] > T[deque.peekLast()]){
Integer beginIndex = deque.pollLast(); //小的出来
res[beginIndex] = i - beginIndex;
}
deque.offerLast(i); //当前的入栈
}
}
return res;
}
}

ps:栈用Stack也是可以的,具体我在博客中有记录,双端队列的速度理论上会比Vector的子类Stack快


其他单调栈系列题可以点这里

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×