前言
贪心/dp/单调栈一类的题,是练习问题分析能力 & 代码能力的好题目。
一、每日温度
二、单调栈
package everyday.medium;
// 每日温度。
public class DailyTemperatures {
/*
target:找后面比当天温度高&离当天最近。
如果是求一天t[i],则往后遍历,寻找到第一个温度比其高的t[j],t[j] > t[i],则 ans = j - i;
如果每一天都要求,就必须把单调减的温度存起来,后面找到一个温度比peek()高的,此时就不仅仅出一个peek了,而是把比当天小的全部出栈,且记录过了多少天。
单调栈中选择存数组hash的key,即索引,不仅可以得到两天的距离,还可以通过temperatures数组比较两天的温度。
*/
public int[] dailyTemperatures(int[] temperatures) {
int[] sk = new int[(int) 1e5];
int len = 0;
int n = temperatures.length;
int[] ans = new int[n];
for (int i = 0; i < n; i++) {
if (0 == len || temperatures[sk[len - 1]] >= temperatures[i]) sk[len++] = i;
else {
while (0 != len && temperatures[sk[len - 1]] < temperatures[i])
ans[sk[len - 1]] = i - sk[--len];
sk[len++] = i;
}
}
return ans;
}
/*
debug记录,
1-长度表示第N天后,不是当天,所以是n = j - i;而不是n = j - i + 1,这是不认真思考/不太专注导致,注意。
2-直接用单调栈中的下标和温度比,忘记单调栈只存hash索引,这也是不认真/不太专注导致,注意。
收获
1-写这种有分析成分的 & 比较考逻辑能力的,比写死知识点练习的爽很多。
2-虽然还不太专注,但是可以训练。
*/
}
总结
1)写这种有分析成分的 & 比较考逻辑能力的,比写死知识点练习的爽很多。
2)虽然还不太专注,但是可以训练。
参考文献
[1] LeetCode 每日温度