代码随想录算法训练营第五十八天| 单调栈 739 每日温度 496 下一个更大元素 I
代码随想录算法训练营第五十八天| 单调栈 739 每日温度 496 下一个更大元素 I
LeetCode 739 每日温度
题目: 739.每日温度
思路:本题首先想到暴力法,两层for循环可以把至少需要等待的天数搜索出来。
单调栈
通常一维数组要寻找任一个元素的右边或左边第一个比自己大或者小的元素的位置,此时可以想到使用单调栈
单调栈的本质是空间换时间,在遍历过程中用一个栈记录右边第一个比当前元素高的元素,优点是整个数组只需遍历一次,单调栈要考虑从栈头到栈底的顺序元素是递增还是递减。
注:如果求一个元素右边第一个更大元素,单调栈就是递增的,如果求一个元素右边第一个更小元素,单调栈就是递减的。
使用单调栈主要有三个判断条件:
- 当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
- 当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
- 当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况
整体代码:
class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> st; //递增栈vector<int> result(temperatures.size(), 0);st.push(0);for(int i = 1; i < temperatures.size(); i++) {if(temperatures[i] < temperatures[st.top()]) {st.push(i);}else if(temperatures[i] == temperatures[st.top()]) {st.push(i);}else{while(!st.empty() && temperatures[i] > temperatures[st.top()]) {result[st.top()] = i - st.top();st.pop();}st.push(i);}}return result;}
};
LeetCode 496 下一个更大元素 I
题目: 496.下一个更大元素 I
与上题思路类似,题目中说是两个没有重复元素 的数组 nums1 和 nums2
没有重复元素可以用map来做映射。根据数值快速找到下标,还可以判断nums2[i]是否在nums1中出现过。
unordered_map<int, int> umap; // key:下标元素,value:下标
for (int i = 0; i < nums1.size(); i++) {umap[nums1[i]] = i;
}
接下来分析三种情况
-
情况一:当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况,此时满足递增栈(栈头到栈底的顺序),所以直接入栈;
-
情况二:当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况,如果相等的话,依然直接入栈;
-
情况三:当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况,此时如果入栈就不满足递增栈了,这也是找到右边第一个比自己大的元素的时候。
判断栈顶元素是否在nums1里出现过,如果出现过,则开始记录结果。
while (!st.empty() && nums2[i] > nums2[st.top()]) {if (umap.count(nums2[st.top()]) > 0) { // 看map里是否存在这个元素int index = umap[nums2[st.top()]]; // 根据map找到nums2[st.top()] 在 nums1中的下标result[index] = nums2[i];}st.pop();
}
st.push(i);
完整代码:
class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {stack<int> st;vector<int> result(nums1.size(), -1);if(nums1.size() == 0) return result;unordered_map<int, int> umap; //key:下标元素,value: 下标for(int i = 0; i < nums1.size(); i++) {umap[nums1[i]] = i;}st.push(0);for(int i = 1; i < nums2.size(); i++) {if(nums2[i] < nums2[st.top()]) {st.push(i);}else if(nums2[i] == nums2[st.top()]) {st.push(i);}else{while(!st.empty() && nums2[i] > nums2[st.top()]) {if(umap.count(nums2[st.top()]) > 0) {int index = umap[nums2[st.top()]];result[index] = nums2[i];}st.pop();}st.push(i);}}return result;}
};