思路:循环数组,相当于后面的元素可以看到前面的元素,那么我们直接把整个数组复制到后面去,这样两倍处理,那么不就可以让后面的元素看到前面的元素了?
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
vector<int>result(nums.size(),-1);
if(nums.size()==0)return result;
stack<int>stk;
stk.push(0);
for(int i=1;i<nums.size()*2;i++)
{
if(nums[i%nums.size()]<=nums[stk.top()])stk.push(i%nums.size());
else
{
while(!stk.empty()&&nums[i%nums.size()]>nums[stk.top()])
{
result[stk.top()]=nums[i%nums.size()];
stk.pop();
}
stk.push(i%nums.size());
}
}
return result;
}
};
单调栈:维护从栈底到栈头是从大到小的顺序,弹出去一个,那么当来一个时候,如果比top大的话,那么这个top肯定是中间,因为弹出top之后,下一个top肯定大于该top的,这样的一定就是凹槽!
class Solution {
public:
int trap(vector<int>& height) {
if(height.size()<=2)return 0;
stack<int>stk;
stk.push(0);
int sum=0;
for(int i=1;i<height.size();i++)
{
if(height[i]<height[stk.top()])
{
stk.push(i);
}else if(height[i]==height[stk.top()])
{
stk.pop();
stk.push(i);
}
else
{
while(!stk.empty()&&height[i]>height[stk.top()])
{
int mid=stk.top();
stk.pop();
if(!stk.empty())
{
int h=min(height[stk.top()],height[i])-height[mid];
int w=i-stk.top()-1;
sum+=h*w;
}
}
stk.push(i);
}
}
return sum;
}
};