Skip to content

Commit 81dc8f7

Browse files
committed
739.每日温度,单调递减栈
1 parent ab0650b commit 81dc8f7

File tree

3 files changed

+60
-8
lines changed

3 files changed

+60
-8
lines changed

leetcode_Java/DoneTitle.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
712. 两个字符串的最小ASCII删除和
9696
714. 买卖股票的最佳时机含手续费
9797
718. 最长重复子数组
98+
739. 每日温度
9899
1020. 飞地的数量
99100
1035. 不相交的线
100101
1143. 最长公共子序列

leetcode_Java/Solution0084.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,20 @@ public int largestRectangleArea(int[] heights) {
4242
/*
4343
单调栈
4444
1、单调栈分为单调递增栈和单调递减栈
45-
1)单调递增栈即栈内元素保持单调递增的栈
46-
2)同理单调递减栈即栈内元素保持单调递减的栈
45+
1)单调递增栈,即栈内元素保持单调递增的栈
46+
2)单调递减栈,即栈内元素保持单调递减的栈
4747
2、操作规则(下面都以单调递增栈为例)
4848
1)如果新元素比栈顶元素大,就入栈
4949
2)如果新元素比栈顶元素小,那就一直把栈顶元素弹出来,直到栈顶元素比新元素小,然后新元素入栈
5050
3、规则效果(举例:栈[1, 5, 6],新元素2)
51-
(1)栈内的元素是递增的
52-
(2)当元素出栈时,这个新元素是出栈元素向右找第一个比它小的元素(2是6右边第一个比它小的元素)
53-
(3)当元素出栈后,新栈顶元素是出栈元素向左找第一个比它小的元素(5是6左边第一个比它小的元素)
51+
1)栈内的元素是递增的
52+
2)当元素出栈时,这个新元素是出栈元素向右找第一个比它小的元素(2是6右边第一个比它小的元素)
53+
3)当元素出栈后,新栈顶元素是出栈元素向左找第一个比它小的元素(5是6左边第一个比它小的元素)
54+
4、使用单调栈的场景
55+
1)需要查找数组每个元素左或右边第一个比它大或小的元素和索引时,可以用单调栈
56+
2)利用栈存放索引,这样既可以通过索引获取索引差值,也可以通过索引从数组获取元素值
57+
3)查找第一个比它大的元素时,用单调递减栈。因为新元素比它小时会入栈,形成单调递减栈,比它大时会出栈。
58+
4)查找第一个比它小的元素时,用单调递增栈。因为新元素比它大时会入栈,形成单调递增栈,比它小时会出栈。
5459
*/
5560

5661

@@ -71,9 +76,7 @@ public int largestRectangleArea(int[] heights) {
7176
int res = 0;
7277
int n = heights.length;
7378
int[] newHeights = new int[n + 2];
74-
for (int i = 0; i < n; i++) {
75-
newHeights[i + 1] = heights[i];
76-
}
79+
System.arraycopy(heights, 0, newHeights, 1, n);
7780
Deque<Integer> stack = new ArrayDeque<>();
7881
for (int right = 0; right < n + 2; right++) {
7982
while (!stack.isEmpty() && newHeights[right] < newHeights[stack.peek()]) {

leetcode_Java/Solution0739.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// 739. 每日温度
2+
3+
4+
/*
5+
暴力:两层for循环遍历数组,查找每个元素右边第一个比它大的元素,计算索引差得到天数i,即为日期left在第i天之后才会有更高的温度
6+
*/
7+
class Solution {
8+
public int[] dailyTemperatures(int[] temperatures) {
9+
int n = temperatures.length;
10+
int[] res = new int[n];
11+
for (int left = 0; left < n - 1; left++) {
12+
for (int right = left + 1; right < n; right++) {
13+
if (temperatures[left] < temperatures[right]) {
14+
res[left] = right - left;
15+
break;
16+
}
17+
}
18+
}
19+
return res;
20+
}
21+
}
22+
23+
24+
/*
25+
单调递减栈:
26+
1、查找每个元素右边第一个比它大的元素,可以利用单调递减栈的特性
27+
2、利用栈存放索引,这样既可以通过索引差获取天数,也可以通过索引从数组获取温度值
28+
3、遍历数组
29+
1)栈为空 或 当前温度不大于栈顶温度,则当前索引入栈
30+
2)栈不为空 且 当前温度大于栈顶温度,则弹出栈顶索引作为日期左边界,当前索引作为日期右边界,计算日期相差天数i,得到出栈索引日期在第i天之后才会有更高的温度。
31+
循环弹出处理,当前温度不大于新栈顶温度,最后当前索引入栈,保证了栈内元素单调递减
32+
4、剩余栈不为空,说明部分日期后没有更高的温度,天数统一为0,由于数组初始化默认值为0,所以不用处理
33+
*/
34+
class Solution {
35+
public int[] dailyTemperatures(int[] temperatures) {
36+
int n = temperatures.length;
37+
int[] res = new int[n];
38+
Deque<Integer> stack = new ArrayDeque<>();
39+
for (int right = 0; right < n; right++) {
40+
while (!stack.isEmpty() && temperatures[right] > temperatures[stack.peek()]) {
41+
int left = stack.pop();
42+
res[left] = right - left;
43+
}
44+
stack.push(right);
45+
}
46+
return res;
47+
}
48+
}

0 commit comments

Comments
 (0)