739 每日温度
https://leetcode-cn.com/problems/daily-temperatures/
题目描述:
具体思路:
从数组最后开始入栈,如果当前元素比栈顶元素还大,说明当前元素所表示的温度比之后的栈顶元素还要大,在当前元素前面的元素对应的温度找更大温度时,一定不会是栈顶元素了,栈顶元素直接弹出。while循环之后栈空,说明当前元素所代表的温度是后面最大的。最后别忘了当前元素对应下标入栈。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n=temperatures.size();
stack<int> st;
vector<int> ans(n,0);
for(int i=n-1;i>=0;i--)
{
int num=temperatures[i];
while(!st.empty()&&num>=temperatures[st.top()])
{
st.pop();
}
ans[i]=st.empty()?0:st.top()-i;
st.push(i);
}
return ans;
}
};
503 下一个更大元素II
https://leetcode-cn.com/problems/next-greater-element-ii/
思路分析:考虑组成一个长度为2*n-1的数组代替环形数组的思路。
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
stack<int> st;
int n=nums.size();
vector<int> ans(n,0);
for(int i=2*n-1;i>=0;i--)
{
int num=nums[i%n];
while(!st.empty()&&num>=st.top())
st.pop();
ans[i%n]=st.empty()?-1:st.top();
st.push(num);
}
return ans;
}
};
496 下一个更大元素I
https://leetcode-cn.com/problems/next-greater-element-i/
这居然是简单题!unordered_map太厉害了!
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
unordered_map <int,int> hashmap;
stack<int> st;
for(int i=nums2.size()-1;i>=0;i--)
{
int num=nums2[i];
while(!st.empty()&&num>=st.top())
st.pop();
hashmap[num]=st.empty()?-1:st.top();
st.push(num);
}
vector<int>res (nums1.size());
for(int i=0;i<nums1.size();i++)
res[i]=hashmap[nums1[i]];
return res;
}
};
456.132模式
https://leetcode-cn.com/problems/132-pattern/
具体思路参考评论区三叶。
k代表出栈元素的最大值,初始化为INT_MIN。
这种做法一定能得到nums[j]最大的一个子序列。
class Solution {
public:
bool find132pattern(vector<int>& nums) {
stack<int> st;
int k=INT_MIN;
for(int i=nums.size()-1;i>=0;i--)
{
if(nums[i]<k) return true;
while(!st.empty()&&nums[i]>st.top())//这个地方不可以为>=,因为k从INT_MIN变成有效值的理由必须是前面有大的数
{
k=max(st.top(),k);
st.pop();
}
st.push(nums[i]);
}
return false;
}
};