leetcode:739. 每日温度
题目
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指在第 i 天之后,才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例:
输入: temperatures = [73,74,75,71,69,72,76,73]输出: [1,1,4,2,1,1,0,0]
输入: temperatures = [30,40,50,60]输出: [1,1,1,0]
输入: temperatures = [30,60,90]输出: [1,1,0]
解答 & 代码
单调栈:
class Solution {public:vector<int> dailyTemperatures(vector<int>& temperatures) {vector<int> answer(temperatures.size(), 0); // 存放答案的数组stack<int> s; // 单调栈,存储下标而非元素// 倒着遍历温度数组,存入单调栈for(int i = temperatures.size() - 1; i >= 0; --i){// 如果单调栈不为空,且栈顶存的下标对应的温度小于等于当前温度,// 那么其存在没有意义,直接pop掉// 因为前面有更高温度存在(即当前的温度),对于更往前的元素,这个top不可能作为其最近更大元素while(!s.empty() && temperatures[s.top()] <= temperatures[i])s.pop();// 获得下标间距:// - 如果单调栈为空,说明往后不存在天气更高的日子,答案记为 0// - 如果单调栈不为空,则当前栈顶下标就是下一个天气更高的日子answer[i] = s.empty() ? 0 : s.top() - i;// 将当前下标入栈s.push(i);}return answer;}};
复杂度分析:假设温度数组中存有 n 天的温度
- 时间复杂度 O(n):温度数组中的每个元素,都会进栈一次,最多出栈一次
- 空间复杂度 O(n):单调栈最坏情况下会存储 n 个下标, 即温度数组单调递增的情况
执行结果:
执行结果:通过执行用时:128 ms, 在所有 C++ 提交中击败了 83.66% 的用户内存消耗:83.1 MB, 在所有 C++ 提交中击败了 88.88% 的用户
