11.4Daily Temperatures单调栈
题目描述
给定每天的温度,求对于每一天需要等几天才可以等到更暖和的一天,如果该天之后不存在更暖和的天气,则记为0。
输入输出样例
Input :{73, 74, 75, 71, 69, 72, 76, 73}
Output:[1, 1, 4, 2, 1, 1, 0, 0]
题解
我们可以维持一个单调递减的栈,表示每天的温度;为了方便计算天数差,我们这里存放位置(即日期)而非温度本身。我们从左向右遍历温度数组,对于每个日期 p,如果 p 的温度比栈顶存储位置 q 的温度高,则我们取出 q,并记录 q 需要等待的天数为 p - q;我们重复这一过程,直到 p 的温度小于等于栈顶存储位置的温度(或空栈)时,我们将 p 插入栈顶,然后考虑下一天。在这个过程中,栈内数组永远保持单调递减,避免了使用排序进行比较。最后若栈内剩余一些日期,则说明它们之后都没有出现更暖和的日期。
cpp
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
// 核心算法函数
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
vector<int> ans(n, 0); // 初始化为0,这样栈中剩余的元素自动对应结果0
stack<int> indices; // 单调栈,存储下标
for (int i = 0; i < n; ++i) {
// 当栈不为空,且当前温度高于栈顶下标对应的温度时
while (!indices.empty() &&
temperatures[i] > temperatures[indices.top()]) {
int pre_index = indices.top();
indices.pop();
ans[pre_index] = i - pre_index; // 计算天数差
}
indices.push(i); // 将当前下标压入栈
}
return ans;
}
// 辅助函数:打印向量
void printVector(const vector<int>& vec) {
cout << "[";
for (size_t i = 0; i < vec.size(); ++i) {
cout << vec[i];
if (i != vec.size() - 1) {
cout << ", ";
}
}
cout << "]" << endl;
}
int main() {
// 定义输入数据
vector<int> temperatures = { 73, 74, 75, 71, 69, 72, 76, 73 };
cout << "Input: {73, 74, 75, 71, 69, 72, 76, 73}" << endl;
// 调用函数
vector<int> result = dailyTemperatures(temperatures);
// 输出结果
cout << "Output: ";
printVector(result);
return 0;
}