LeetCode 739. 每日温度
📌 题目描述
题目级别:中等
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
- 示例 1:
输入:temperatures = [73,74,75,71,69,72,76,73]
输出:[1,1,4,2,1,1,0,0]
💡 破题思路:从右向左维护单调递减栈
寻找"下一个更大的元素",是单调栈 的绝对主场。
我们采用从右向左倒序遍历数组的方式。
核心逻辑:
假设我们站在某一天,往右看。如果右边有一座"高山"(高温),那么这座高山背后的"小丘陵"(低温)我们就永远看不到了------因为只要我们在找"比今天高的温度",那座高山一定会先满足要求,背后那些比较矮的温度彻底失去了被用作答案的价值。
因此,我们可以维护一个栈:
- 遇到当天的温度,就把它和栈顶的温度比较。
- 如果栈顶的温度 小于等于 当天温度,说明栈顶的温度变成了"毫无价值的矮丘陵",直接弹出 (
pop) 淘汰! - 一直弹,直到栈空了,或者栈顶遇到了一个比当天温度高的"高山"。
- 此时,栈顶的那天就是我们要找的"下一个更高温度"。距离就是
栈顶天数 - 当天天数。 - 最后,把当天的天数压入栈中,作为后续天数可能的"高山"。
极客优化:
栈中不需要同时存入温度和天数(不需要用 pair)。只存天数(索引)即可! 因为有了索引,随时可以通过 temperatures[st.top()] 拿到对应的温度。
💻 C++ 代码实现 (仅存下标极简版)
cpp
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
vector<int> res(n, 0); // 初始化为 0
stack<int> st; // 栈中只存天数下标!
// 从最后一天开始往前推
for (int i = n - 1; i >= 0; i--) {
// 只要栈顶的那天温度不如今天热,栈顶就永远失去了作为"未来更高温"的资格,弹栈淘汰
while (!st.empty() && temperatures[st.top()] <= temperatures[i]) {
st.pop();
}
// 弹完之后,如果栈没空,栈顶就是离今天最近的、比今天热的那天
if (!st.empty()) {
res[i] = st.top() - i;
}
// 把今天压入栈中,等待前面日子来仰望
st.push(i);
}
return res;
}
};