739. 每日温度
题目链接:每日温度
题目描述:给定一个整数数组
temperatures
,表示每天的温度,返回一个数组answer
,其中answer[i]
是指对于第i
天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用0
来代替。
暴力解法:
两层for循环,把至少需要等待的天数就搜出来了。时间复杂度是O(n^2)
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
vector<int> result(temperatures.size(), 0);
for (int i = 0; i < temperatures.size(); i++) {
for (int j = i + 1; j < temperatures.size(); j++) {
if (temperatures[j] > temperatures[i]) {
result[i] = j - i;
break;
}
}
}
return result;
}
};
暴力解法会超时
单调栈:
可以维护一个存储下标的单调栈,从栈底到栈顶的下标对应的温度列表中的温度依次递减。如果一个下标在单调栈里,则表示尚未找到下一次温度更高的下标。
正向遍历温度列表。对于温度列表中的每个元素 temperatures[i],如果栈为空,则直接将 i 进栈,如果栈不为空,则比较栈顶元素 prevIndex 对应的温度 temperatures[prevIndex] 和当前温度 temperatures[i],如果 temperatures[i] > temperatures[prevIndex],则将 prevIndex 移除,并将 prevIndex 对应的等待天数赋为 i - prevIndex,重复上述操作直到栈为空或者栈顶元素对应的温度小于等于当前温度,然后将 i 进栈。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
vector<int> result(temperatures.size(), 0);
stack<int> st;
st.push(0);
for (int i = 1; i < temperatures.size(); i++) {
while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
result[st.top()] = i - st.top();
st.pop();
}
st.push(i);
}
return result;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(n)
496.下一个更大元素 I
题目链接:下一个更大元素 I
题目描述:
nums1
中数字x
的 下一个更大元素 是指x
在nums2
中对应位置 右侧 的 第一个 比x
****大的元素。给你两个 没有重复元素 的数组
nums1
和nums2
,下标从 0 开始计数,其中nums1
是nums2
的子集。对于每个
0 <= i < nums1.length
,找出满足nums1[i] == nums2[j]
的下标j
,并且在nums2
确定nums2[j]
的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是-1
。返回一个长度为
nums1.length
的数组 **ans
**作为答案,满足 **ans[i]
**是如上所述的 下一个更大元素 。
解题思路:
我们可以先预处理 nums2,使查询 nums1中的每个元素在 nums2中对应位置的右边的第一个更大的元素值时不需要再遍历 nums2。于是,我们将题目分解为两个子问题:
- 第 1个子问题:如何高效地计算 nums2中每个元素右边的第一个更大的值;
- 第 2个子问题:如何存储第 1个子问题的结果。
对于第1个问题,使用上题中的方法即可。对于第2个问题,可以使用map这一数据结构。
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int, int> map;
stack<int> st;
vector<int> result;
for (int num : nums2) {
while (!st.empty() && num > st.top()) {
map[st.top()] = num;
st.pop();
}
st.push(num);
}
while (!st.empty()) {
map[st.top()] = -1;
st.pop();
}
for (int num : nums1) {
result.push_back(map[num]);
}
return result;
}
};