930. 和相同的二元子数组

Posted ai52learn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了930. 和相同的二元子数组相关的知识,希望对你有一定的参考价值。

给你一个二元数组 nums ,和一个整数 goal ,请你统计并返回有多少个和为 goal 的 非空 子数组。

子数组 是数组的一段连续部分。

示例 1:

输入:nums = [1,0,1,0,1], goal = 2
输出:4
解释:
有 4 个满足题目要求的子数组:[1,0,1]、[1,0,1,0]、[0,1,0,1]、[1,0,1]
示例 2:

输入:nums = [0,0,0,0,0], goal = 0
输出:15
 

提示:

1 <= nums.length <= 3 * 104
nums[i] 不是 0 就是 1
0 <= goal <= nums.length

class Solution {
public:
    int numSubarraysWithSum(vector<int>& nums, int goal) {
        int l = 0, r = 0,cnt=nums[0],ret=0,a[30001]={0},b[30001]={0};
        for(int i =0;i<nums.size();i++)
        {
            int j = i;
            while(j<nums.size()&&nums[j]==0)
            {
                a[i]++;
                j++;
            }
            if(a[i]>0)
            {
                b[j-1]=a[i];
                i = j;
            }
        }
        if(!goal)
        {
            for(int i =0;i<nums.size();i++)
                if(a[i]) ret+=a[i]*(a[i]-1)/2+a[i];
            return ret;
        }
        while(l<nums.size()&&nums[l]==0) l++;
        r = l;
        if(l<nums.size()) cnt = nums[l];
        int gg = 0;
        while(l<nums.size())
        {
            while(r<nums.size()&&cnt<goal)
            {
                cnt+=nums[++r];
            }
            if(r>=nums.size()) break;
            if(goal==cnt)
            {
                int t = 1;
                if(l-1>=0&&b[l-1]>0) t*=(b[l-1]+1);
                if(r+1<=nums.size()&&a[r+1]>0) t*=(a[r+1]+1);
                ret+=t;
            }
            cnt -= nums[l++];
            while(l<nums.size()&&nums[l]==0) l++;
        }
        return ret;
    }
};

以上是关于930. 和相同的二元子数组的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 930.和相同的二元子数组

[M前缀和] lc930. 和相同的二元子数组(滑动窗口+双指针+哈希优化)

LeetCode 930 和相同的二元子数组[动态规划 前缀和] HERODING的LeetCode之路

Leetcode-930 Binary Subarrays With Sum(和相同的二元子数组)

930. 和相同的二元子数组/238. 除自身以外数组的乘积/1262. 可被三整除的最大和/NC90 设计getMin功能的栈/NC67连续子数组的最大和/NC115 栈和排序

[M前缀和] lc560. 和为K的子数组(经典好题+哈希优化)