- 单调递增栈:数据出栈的序列为单调递增序列
- 单调递减栈:数据出栈的序列为单调递减序列
1.视野总和
描叙:有n个人站队,所有的人全部向右看,个子高的可以看到个子低的发型,给出每个人的身高,问所有人能看到其他人发现总和是多少。
输入:4 3 7 1
输出:2
解释:个子为4的可以看到个子为3的发型,个子为7可以看到个子为1的身高,所以1+1=2
思路:观察后发现,实际上题目可以转化为——计算当前数字和它右边第一个大于他的数字之间有多少个数字,然后遍历每个数字将结果累加就是答案,但是这里时间复杂度为O(N^2)。
所以我们将问题转化为——求每个人被看到的次数(即这个人向左单调递增的区间长度)。
考虑使用单调栈解决——从左到右依次读取当前人的高度,从栈顶开始把高度小于或等于当前人的高度的那些元素删除,此时栈中剩下的元素的数量就是可以看见当前人的其他人的数量。
#include <iostream>
#include <stack>
using namespace std;
int sumOfBeingSeen(int* arr,int n){
stack<int> s;
int sum=0;
for(int i=0;i<n;i++){
while(!s.empty()){
if(s.top()<=arr[i])
s.pop();
else{
sum+=s.size();
break;
}
}
s.push(arr[i]);
}
return sum;
}
int main(){
int n;
cin>>n;
int *arr=new int[n];
for(int i=0;i<n;i++)
cin>>arr[i];
cout<<sumOfBeingSeen(arr,n);
return 0;
}