一【题目类别】
- 栈
二【题目难度】
- 中等
三【题目编号】
- 739.每日温度
四【题目描述】
- 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
五【题目示例】
-
示例 1:
- 输入: temperatures = [73,74,75,71,69,72,76,73]
- 输出: [1,1,4,2,1,1,0,0]
-
示例 2:
- 输入: temperatures = [30,40,50,60]
- 输出: [1,1,1,0]
-
示例 3:
- 输入: temperatures = [30,60,90]
- 输出: [1,1,0]
六【题目提示】
- 1 < = t e m p e r a t u r e s . l e n g t h < = 1 0 5 1 <= temperatures.length <= 10^5 1<=temperatures.length<=105
- 30 < = t e m p e r a t u r e s [ i ] < = 100 30 <= temperatures[i] <= 100 30<=temperatures[i]<=100
七【解题思路】
- 使用一个栈来保存温度数组中每个元素的下标,这个栈就是单调递减的栈,我们需要维护这个栈
- 在遍历到一个新的元素时,首先将其下标压入栈中
- 然后,使用一个while循环,将栈顶元素对应的温度与当前温度比较。如果当前温度比栈顶温度高,就说明当前温度是栈顶温度右边第一个比它高的温度,可以计算出它们之间的天数,并将结果保存到结果数组中
- 然后,弹出栈顶元素并继续比较下一个栈顶元素,直到栈为空或者当前温度比栈顶温度低为止
- 最后,将当前元素的下标压入栈中
- 遍历结束后,结果数组中保存的就是每个温度右边第一个比它高的温度与它之间的天数。如果一个温度右边没有比它高的温度,则结果数组中对应的值为0
八【时间频度】
- 时间复杂度: O ( n ) O(n) O(n), n n n为传入数组的长度
- 空间复杂度: O ( n ) O(n) O(n), n n n为传入数组的长度
九【代码实现】
- Java语言版
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int len = temperatures.length;
Deque<Integer> stack = new LinkedList<Integer>();
int[] res = new int[len];
for(int i = 0;i<len;i++){
int temp = temperatures[i];
while(!stack.isEmpty() && temp > temperatures[stack.peek()]){
int preIndex = stack.pop();
res[preIndex] = i - preIndex;
}
stack.push(i);
}
return res;
}
}
- C语言版
int* dailyTemperatures(int* temperatures, int temperaturesSize, int* returnSize)
{
int len = temperaturesSize;
int* stack = (int*)calloc(len,sizeof(int));
int top = -1;
int* res = (int*)calloc(len,sizeof(int));
for(int i = 0;i < len;i++)
{
int temp = temperatures[i];
while(top != -1 && temp > temperatures[stack[top]])
{
int preIndex = stack[top--];
res[preIndex] = i - preIndex;
}
stack[++top] = i;
}
*returnSize = temperaturesSize;
free(stack);
return res;
}
- Python语言版
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
length = len(temperatures)
stack = []
res = [0] * length
for i in range(0,length):
temp = temperatures[i]
while(len(stack) != 0 and temp > temperatures[stack[-1]]):
preIndex = stack.pop()
res[preIndex] = i - preIndex
stack.append(i)
return res
- C++语言版
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int len = temperatures.size();
stack<int> st;
vector<int> res(len);
for(int i = 0;i<len;i++){
int temp = temperatures[i];
while(!st.empty() && temp > temperatures[st.top()]){
int preIndex = st.top();
st.pop();
res[preIndex] = i - preIndex;
}
st.push(i);
}
return res;
}
};
十【提交结果】
-
Java语言版
-
C语言版
-
Python语言版
-
C++语言版