根据每日 气温
列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高的天数。如果之后都不会升高,请输入 0
来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73]
,你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]
。
提示:气温
列表长度的范围是 [1, 30000]
。每个气温的值的都是 [30, 100]
范围内的整数。
O(N^2)解法
这里有一个小技巧是提前设置一个day=0的初值
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
vector<int> result;
for (int i = 0; i < T.size(); i ++) {
int day = 0;
for (int j = i + 1; j < T.size(); j ++) {
if (T[j] > T[i]) {
day = j - i;
break;
}
}
result.push_back(day);
}
return result;
}
};
O(N)解法
维护递减栈,后入栈的元素总比栈顶元素小。
- 比对当前元素与栈顶元素的大小
- 若当前元素 < 栈顶元素:入栈
- 若当前元素 > 栈顶元素:弹出栈顶元素,记录两者下标差值即为所求天数
事实上栈只需要记录数组的小标即可,可以进一步减小空间复杂度
static int n=[](){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return 0;
}();
class Solution {
struct dict{
int key;
int value;
dict(int key_, int value_):key(key_),value(value_) {}
};
public:
vector<int> dailyTemperatures(vector<int>& T) {
vector<int> result(T.size(),0);
stack<dict> s;
for (int i = 0; i < T.size(); i ++) {
while(!s.empty() && s.top().value<T[i]){
result[s.top().key] = i - s.top().key;
s.pop();
}
s.push(dict(i,T[i]));
}
return result;
}
};
用栈记录下标代码
static int n=[](){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return 0;
}();
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
int n = T.size();
stack<int> st;
vector<int> ans(n);
for(int i=0; i<n; i++){
while(!st.empty() && T[st.top()] < T[i]){
ans[st.top()] = i - st.top();
st.pop();
}
st.push(i);
}
return ans;
}
};