题目:
每日温度
根据每日 气温
列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0
来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73]
,你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]
。
提示:气温
列表长度的范围是 [1, 30000]
。每个气温的值的均为华氏度,都是在 [30, 100]
范围内的整数。
思路:
- 这道题显然不能通过BF来求解。我们得另辟蹊径。
- 栈存在的意义:当碰到后面某一特定元素,前面的元素需要得到处理时,就可以利用栈来求解。
- 还有一点,栈中的元素有所谓的标准进行排序的,栈底的元素是最大的,栈顶的元素则是最小的。碰到某一元素入栈,他就要把所有比他小的都处理掉。
- 本体中,所谓的标准就是日子的索引,当我们碰到一个元素,看看它能不能处理我们栈中遗留的元素。
AC代码:
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
vector<int> dailyTemperatures(vector<int>& T) {
stack<int> indexes;
vector<int> result(T.size(), 0);
for (int i = 0; i < T.size(); ++i) {
// 为什么是后面的元素呢?因为indexes里放的都是之前访问过的元素
while (!indexes.empty() && T[indexes.top()] < T[i]) {
result[indexes.top()] = i - indexes.top();
indexes.pop();
}
indexes.push(i);
}
return result;
}
int main() {
int n;
cin >> n;
vector<int> T;
for (int i = 0; i < n; ++i) {
int num;
cin >> num;
T.push_back(num);
}
auto m = dailyTemperatures(T);
for (auto mm : m) {
cout << mm << " ";
}
cout << endl;
return 0;
}
其他经验:
栈确实要判断是否为空,才能取栈顶元素啊。