统计子数组个数

https://leetcode-cn.com/problems/count-number-of-nice-subarrays/
方式一数学方法:
由例子我们可以看出来:
符合要求的数组个数等于
这个k个连续奇怪数的可组成的数组个数为 第一个前端的偶数*最后一个后端的,这样我们便可以通过这种方式算
class Solution { public: int numberOfSubarrays(vector<int>& nums, int k) { int a[100086]; int ans=0; int sum=0; for(int i=0;i<nums.size();i++) { if(nums[i]&1)//判断是否为奇数 { a[ans]=i;//是的画记录下位置 ans++; } } if(k>ans) return 0; for(int i=0;i<=ans-k;i++) { int x,y; if(i==0) x=a[0]+1;如果开端是最开头的+1 else x=a[i]-a[i-1]; if(i+k-1!=ans-1) y=a[i+k]-a[i+k-1]; else y=nums.size()-a[ans-1]; sum+=x*y; } return sum; } };
方式二:前缀和+差分
dp[i]记录的为当前位置有出现i从奇数的可能性
所有dp[cnt-k]求的便是可能情况
class Solution { public: int numberOfSubarrays(vector<int>& nums, int k) { int cnt=0; int dp[100086]; int ans=0; memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=0;i<nums.size();i++) { cnt+=nums[i]&1;//记录个数 dp[cnt]+=1;同时频度+1 if(cnt>=k) ans+=dp[cnt-k]; } return ans; } };

浙公网安备 33010602011771号