2972. 统计移除递增子数组的数目 II
思路:双指针。删除一个子数组后,数组nums可划分为前、后两端。
先计算出数组nums前端最长的递增序列[0,i],然后遍历后端的递增序列[j,n-1]来计算子数组的个数。
对于前段序列[0,i],可以形成i+2个前端区间,都符合要求。所以只需要枚举所有可能的后端序列(可为0)
class Solution {
public:
int incremovableSubarrayCount(vector<int>& nums) {
int n=nums.size();
int i=0;
//计算出数组nums前端最长的递增序列[0,i]
for(;i+1<n;i++){
if(nums[i]>=nums[i+1]) break;
}
//整个数组都是递增的
if(i==n-1) return n*(n+1)/2;
//后端序列为0时。
int ans=i+2;
//枚举所有可能的后端序列
for(int j=n-1;j>=0;j--){
if(j!=n-1&&nums[j]>=nums[j+1]) break;
while(i>=0&&nums[i]>=nums[j]) i--;
//cout<<ans<<":"<<i<<"-"<<j<<endl;
ans+=i+2;
}
return ans;
}
};