统计子数组个数

 

 

 

 

 

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;
    }
};

 

posted @ 2020-04-21 11:19  ___Charles  阅读(804)  评论(0)    收藏  举报