单调栈
739每日温度
单调栈模板题
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n=temperatures.size();
vector<int> ans(n,0);
stack<int> stk;
for(int i=0;i<n;i++)
{
if(stk.empty())
{
stk.push(i);
continue;
}
if(temperatures[stk.top()]>temperatures[i])
{
stk.push(i);
}
else
{
while(!stk.empty()&&temperatures[i]>temperatures[stk.top()])
{
ans[stk.top()]=i-stk.top();
stk.pop();
}
stk.push(i);
}
}
return ans;
}
};
496下一个更大元素
同样是单调栈套皮,只是存的东西不一样了
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
int n=nums1.size();
int m=nums2.size();
vector<int> temp(m,-1);
vector<int> ans(n,0);
stack<int> stk;
for(int i=0;i<m;i++)
{
if(stk.empty())
{
stk.push(i);
continue;
}
if(nums2[stk.top()]>nums2[i])
{
stk.push(i);
}
else
{
while(!stk.empty()&&nums2[stk.top()]<nums2[i])
{
temp[stk.top()]=nums2[i];
stk.pop();
}
stk.push(i);
}
}
unordered_map<int,int> mymap;
for(int i=0;i<m;i++)
{
mymap.emplace(nums2[i],temp[i]);
}
for(int i=0;i<n;i++)
{
ans[i]=mymap[nums1[i]];
}
return ans;
}
};
503下一个更大元素ii
两遍单调栈
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int n=nums.size();
vector<int> ans(n,-1);
stack<int> stk;
for(int i=0;i<n;i++)
{
if(stk.empty())
{
stk.push(i);
continue;
}
if(nums[stk.top()]>nums[i])
{
stk.push(i);
}
else
{
while(!stk.empty()&&nums[stk.top()]<nums[i])
{
ans[stk.top()]=nums[i];
stk.pop();
}
stk.push(i);
}
}
for(int i=0;i<n;i++)
{
if(stk.empty())
{
stk.push(i);
continue;
}
if(nums[stk.top()]>nums[i])
{
stk.push(i);
}
else
{
while(!stk.empty()&&nums[stk.top()]<nums[i])
{
ans[stk.top()]=nums[i];
stk.pop();
}
stk.push(i);
}
}
return ans;
}
};
接雨水
经典题目,思路比较简单,但是实现上要注意许多细节
class Solution {
public:
int trap(vector<int>& height) {
int ans=0;
int n=height.size();
stack<int> stk;
for(int i=0;i<n;i++)
{
if(stk.empty())
{
stk.push(i);
continue;
}
if(height[stk.top()]>height[i])
{
stk.push(i);
}
else if(height[stk.top()]==height[i])
{
stk.pop();
stk.push(i);
}
else
{
while(!stk.empty()&&height[stk.top()]<height[i])
{
int mid=stk.top();
stk.pop();
if(!stk.empty())
ans+=(min(height[stk.top()],height[i])-height[mid])*(i-stk.top()-1);
}
stk.push(i);
}
}
return ans;
}
};