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; }
};
496.下一个更大元素I
题目链接 文章讲解 视频讲解
思路:建立一个map映射,将nums1中的元素和下标做映射,使得根据元素可以获得下标
class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {stack<int> st;vector<int> result(nums1.size(), -1);unordered_map<int, int> umap;for(int i = 0; i < nums1.size(); ++i) umap[nums1[i]] = i;for(int i = 0; i < nums2.size(); ++i) {while(!st.empty() && nums2[i] > st.top()) {if(umap.find(st.top()) != umap.end())result[umap[st.top()]] = nums2[i];st.pop();}st.push(nums2[i]);}return result;}
};
503.下一个更大的元素II
题目链接 文章讲解 视频讲解
只需将数组遍历两遍,计算下标时使用i % nums.size()
class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {stack<int> st;vector<int> result(nums.size(), -1);for(int i = 0; i < 2 * nums.size(); ++i) {while(!st.empty() && nums[i % nums.size()] > nums[st.top()]) {result[st.top()] = nums[i % nums.size()];st.pop();}st.push(i % nums.size());}return result;}
};