传送锚点:
Given an array of integers temperatures
represents the daily temperatures, return an array answer
such that answer[i]
is the number of days you have to wait after the ith
day to get a warmer temperature. If there is no future day for which this is possible, keep answer[i] == 0
instead.
Example 1:
Input: temperatures = [73,74,75,71,69,72,76,73]
Output: [1,1,4,2,1,1,0,0]
Example 2:
Input: temperatures = [30,40,50,60]
Output: [1,1,1,0]
Example 3:
Input: temperatures = [30,60,90]
Output: [1,1,0]
Constraints:
-
1 <= temperatures.length <= 105
-
30 <= temperatures[i] <= 100
从前往后遍历思路
一开始我们初始化答案数组,赋值为0
我们开一个栈,栈类型为pair[HTML_REMOVED],从前往后遍历,如果当前栈为空 或者 遍历的温度小于等于栈顶温度,则加入栈,
如果栈顶温度小于遍历温度,不断判断栈内元素,直到栈为空或者栈顶温度大于等于遍历温度,弹出符合条件的栈顶元素,
遍历完最后加入栈中
Code
typedef pair<int, int> pii;
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<pii> st; // 第一个节点存储下标 第二个节点存储温度
vector<int> ans(temperatures.size(), 0);
for (int i = 0; i < temperatures.size(); i++) {
if (st.empty() || temperatures[i] <= st.top().second) {
st.push(pii(i, temperatures[i]));
} else { // 当前遍历的温度大于栈顶温度
//继续遍历
while(st.size() && temperatures[i] > st.top().second){
pii p = st.top();
st.pop();
ans[p.first] = i - p.first;
}
st.push(pii(i, temperatures[i]));
}
}
return ans;
}
};
从后往前遍历思路
一开始我们初始化答案数组,赋值为0
我们开一个栈,栈类型为pair[HTML_REMOVED],从后往前遍历,若栈内存在元素 并且 当前遍历的温度大于等于栈顶温度,栈顶元素弹出,直到栈顶为空 或者 遍历温度小于栈顶,
遍历温度小于栈顶(栈不为空),更新ans数组,
入栈
Code
typedef pair<int, int> pii;
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<pii> st; // 第一个节点存储下标 第二个节点存储温度
vector<int> ans(temperatures.size(), 0);
//从后往前遍历
for (int i = temperatures.size() - 1; i >= 0; i--) {
while(st.size() && temperatures[i] >= st.top().second){
st.pop();
}
if(!st.empty()){
ans[i] = st.top().first - i;
}
st.push(pii(i, temperatures[i]));
}
return ans;
}
};