代码随想录算法训练营第58天|739. 每日温度,496.下一个更大元素 I
代码随想录算法训练营第58天|739. 每日温度,496.下一个更大元素 I
- 739. 每日温度
- 496.下一个更大元素 I
739. 每日温度
题目链接:739. 每日温度,难度:中等
【实现代码】
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> st;
vector<int> result(temperatures.size(), 0);
for (int i = 0; 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;
}
};
【解题思路】
使用单调栈的解法。
什么时候用单调栈呢?
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。
在使用单调栈的时候首先要明确如下几点:
- 单调栈里存放的元素是什么?
单调栈里只需要存放元素的下标i就可以了,如果需要使用对应的元素,直接T[i]就可以获取。- 单调栈里元素是递增呢? 还是递减呢?
这里我们要使用递增循序(再强调一下是指从栈头到栈底的顺序),因为只有递增的时候,栈里要加入一个元素i的时候,才知道栈顶元素在数组中右面第一个比栈顶元素大的元素是i。- 使用单调栈主要有三个判断条件。
- 当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况,入栈
- 当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况,入栈
- 当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况,循环弹出栈顶比当前元素的值,并使用容器记录,即:
while (!st.empty() && temperatures[i] > temperatures[st.top()]) { result[st.top()] = i - st.top(); st.pop(); }
- 容器的选取要根据题意选择,使用vector、unordered_map等。
496.下一个更大元素 I
题目链接:496.下一个更大元素 I,难度:简单
【实现代码】
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int> st;
unordered_map<int, int> um;
vector<int> ans(nums1.size(), -1);
for (int i = 0; i < nums1.size(); i++) {
um[nums1[i]] = i;
}
for (int i = 0; i < nums2.size(); i++) {
while (!st.empty() && nums2[i] > nums2[st.top()]) {
if (um.count(nums2[st.top()]) == 1) {
ans[um[nums2[st.top()]]] = nums2[i];
}
st.pop();
}
st.push(i);
}
return ans;
}
};
【解题思路】
本体主要的思路是先使用map进行快速选择元素对应的下标,以及在另一数组中的查找,接下来使用单调栈进行判断,需注意的一点是
if (um.count(nums2[st.top()]) == 1) { ans[um[nums2[st.top()]]] = nums2[i]; }
容器的选取要根据题意选择,本题使用unordered_map等。
我的思路如下,但是略浪费空间,但是容易理解,而且栈中直接存放数值而不是下标,更方便
思路:先对nums2中的元素找到一个result数组,result中存的是下一个更大元素的位置,再遍历nums1中的元素,找到其在nums2中的下标,再去result中查找对应下标的值