问题描述
![](https://i-blog.csdnimg.cn/blog_migrate/389c4b0eddafb2ad7dc6d4b5e9cad198.png)
解题报告
子数组具有连续性。
一共有两种方法:
-
暴力搜索
确定起点,确定终点,判断这之间的子数组是否符合题目要求 -
维持一个非严格单调递增栈
当前元素小于栈顶元素时,以栈顶元素作为起始的子数组必定只有【当前元素和栈顶元素的距离】个;
此方法最关键的是,我们需要自己添加边界, 长度为n的数组,符合题目条件的数组个数至少为n。
代码实现
1.暴力搜索
class Solution {
public:
int validSubarrays(vector<int>& nums) {
int res=0,n=nums.size();
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
if(nums[j]>=nums[i]){
res+=1;
}
else{
break;
}
}
}
return res;
}
};
2.维持一个非严格单调递增栈
class Solution{
public:
int validSubarrays(vector<int>&nums){
nums.push_back(-9999);
int res=0,n=nums.size();
stack<int>s;
for(int i=0;i<n;i++){
while(!(s.empty()) && nums[s.top()]>nums[i]){
res+=(i-s.top());
s.pop();
}
s.push(i);
}
return res;
}
};
两种方法资源耗费情况对比
![](https://i-blog.csdnimg.cn/blog_migrate/88fe4c4da4f31672c4b3c852d8ea4122.png)