LeetCode 739 - 每日温度(中等)
第一次尝试 - 暴力法 (TLE)
语言:C++
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
vector<int> ans(n);
ans[n - 1] = 0;
for (int i = 0; i < n - 1; i++) {
int cnt = 0;
for (int j = i + 1; j < n; j++) {
cnt++;
if (temperatures[j] > temperatures[i]) {
ans[i] = cnt;
break;
}
}
}
return ans;
}
};
意料之中的结果,暴力法求解时间复杂度过高,在面对大数据量时会超时。
第二次尝试 - 单调栈 (AC)
可以维护一个存储下标的单调栈,从栈底到栈顶的下标对应的温度列表中的温度依次递减。遍历整个数组,如果栈不为空且当前数字大于栈顶元素,直接入栈的话就不是单调(递减)栈,所以需要取出栈顶元素,由于当前数字一定是第一个大于栈顶元素的数,因此直接求出栈顶元素和当前元素的下标差就是二者的距离。
对于温度列表中的每个元素temperatures[i]
,如果栈为空,则直接将i
进栈,如果栈不为空,则比较栈顶元素pre
对应的温度 temperatures[pre]
和当前温度temperatures[i]
,如果temperatures[i] > temperatures[pre]
,则将pre
移除,并将pre
对应的等待天数赋为i - pre
,重复上述操作直到栈为空或者栈顶元素对应的温度小于等于当前温度,然后将i
进栈。
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 pre = s.top();
ans[pre] = i - pre;
s.pop();
}
s.push(i);
}
return ans;
}
};