1、题目描述
请根据每日?气温 ?列表?temperatures ?,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用?0 ?来代替。
?2、算法分析
以温度列表?[73,74,75,71,69,72,76,73]为例子。
本题Stack存储result数组结果集的下表,result数组存储结果集。
① 当 i=0 时,单调栈为空,因此将 0 进栈。
stack=[0(73)]
ans=[0,0,0,0,0,0,0,0]
② 当 i=1时,由于 7474 大于 7373,因此移除栈顶元素 0,赋值 ans[0]:=1?0,将 1 进栈。
stack=[1(74)]
ans=[1,0,0,0,0,0,0,0]
③ 当 i=2时,由于 7575 大于 7474,因此移除栈顶元素 1,赋值 ans[1]:=2?1,将 2 进栈。
stack=[2(75)]
ans=[1,1,0,0,0,0,0,0]
④ 当 i=3时,由于 7171 小于 7575,因此将 3?进栈。
stack=[2(75),3(71)]
ans=[1,1,0,0,0,0,0,0]
⑤ 当 i=4 时,由于 6969 小于 7171,因此将 4 进栈。
stack=[2(75),3(71),4(69)]
ans=[1,1,0,0,0,0,0,0]
⑥ 当 i=5 时,由于 7272 大于 6969 和 7171,因此依次移除栈顶元素 4?和 3,赋值 ans[4]:=5-4和 ans[3]:=5?3,将 5 进栈。
stack=[2(75),5(72)]
ans=[1,1,0,2,1,0,0,0]
⑦ 当 i=6时,由于 7676 大于 7272 和 7575,因此依次移除栈顶元素 5?和 2,赋值 ans[5]:=6-5和 ans[2]:=6?2,将 6 进栈。
stack=[6(76)]
ans=[1,1,4,2,1,1,0,0]
⑧ 当 i=7 时,由于 7373 小于 7676,因此将 7?进栈。
stack=[6(76),7(73)]
ans=[1,1,4,2,1,1,0,0]
3、代码实现
最好举个例子跟着代码走一遍,while循环里有逻辑思维的强度
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
// 计算 数组长度
int length = temperatures.length;
// 定义数组输出结果集
int[] result = new int[length];
// 定义栈存储
Stack<Integer> stack = new Stack<>();
// 遍历参数数组
for(int i = 0;i < length;i++){
// 获取数组的元素
int temperature = temperatures[i];
// 重点来了
// 若栈不空,且当前元素大于以栈为索引的元素,则计算结果存储到数组中
while(!stack.isEmpty() && temperature > temperatures[stack.peek()]){
int preIndex = stack.pop();
result[preIndex] = i - preIndex;
}
//
stack.push(i);
}
return result;
}
}
|