题目739. 每日温度
8.1 官方解析
方法一:暴力
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
vector<int> ans(n), next(101, INT_MAX);
for (int i = n - 1; i >= 0; --i) {
int warmerIndex = INT_MAX;
for (int t = temperatures[i] + 1; t <= 100; ++t) {
warmerIndex = min(warmerIndex, next[t]);
}
if (warmerIndex != INT_MAX) {
ans[i] = warmerIndex - i;
}
next[temperatures[i]] = i;
}
return ans;
}
};
- 方法二:单调栈
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
vector<int> ans(n);
stack<int> s;
for (int i = 0; i < n; ++i) {
while (!s.empty() && temperatures[i] > temperatures[s.top()]) {
int previousIndex = s.top();
ans[previousIndex] = i - previousIndex;
s.pop();
}
s.push(i);
}
return ans;
}
};
8.2 解法1
(同官方解析的 方法二 ,官方解析写的更简洁,复习时看官方解析即可。)
刚开始做这道题时并没有想到用栈去保存日期,一直尝试直接操作温度,通过温度之间的高低变化去计算。后面看了题解后才做出来。
首先要理清思路,然后再尝试写代码!
这里我们要维持一个栈,存放位置(即日期)而非温度本身。
从左向右遍历数组,对于每个日期p,如果p 的温度比栈顶存储位置q 的温度高,则取出q,并记录q 所需要等待的天数为p-q;直到p 的温度小于等于栈顶存储位置的温度(或空栈)时,我们将p 插入栈顶,然后考虑下一天。最后若栈内剩余一些日期,则说明他们之后都没有出现更暖和的日期。
在这个过程中,栈内数组永远保持单调递减。
简单讲:
- 如果p 温度 > 栈顶q 温度,则取出q 并记录q。
- 直到p温度 ≤ 栈顶q 的温度,将p 插入栈中。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
vector<int> result(n); // 保存返回结果
stack<int> index; // 存储日期的栈
for (int i = 0; i < n; ++i) {
while (!index.empty()) {
int pre_index = index.top(); // 取出栈顶元素
if (temperatures[i] <= temperatures[pre_index]) {
break; // 退出while循环
}
index.pop();
result[pre_index] = i - pre_index; // 记录结果
}
index.push(i); // 入栈
}
return result;
}
};
8.3 解法2
Carl哥说:在一开始的时候就把每种情况分析好,不要一上来就尝试用简短代码写,因为关键细节都被隐藏了。
下面看看规规矩矩的代码:
// 版本一
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
// 递减栈
stack<int> st;
vector<int> result(T.size(), 0);
st.push(0);
for (int i = 1; i < T.size(); i++) {
if (T[i] < T[st.top()]) { // 情况一
st.push(i);
} else if (T[i] == T[st.top()]) { // 情况二
st.push(i);
} else {
while (!st.empty() && T[i] > T[st.top()]) { // 情况三
result[st.top()] = i - st.top();
st.pop();
}
st.push(i);
}
}
return result;
}
};
然后再去尝试写的更简洁!即前面的 官方解析 / 解法1。