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]

题源:https://leetcode-cn.com/problems/binary-subarrays-with-sum/

代码:

class Solution {
public:
    int numSubarraysWithSum(vector<int>& nums, int goal) {
        int l=nums.size();
        int res=0;
        int pos[30005];
   
        if (goal==0)
        {
            int i=0;
            int k;
            while(i<l)
            {
                if (nums[i]==1) {i++; continue;}
                k=0;
                while(i<l && nums[i]==0) {k++; i++;}
                res+=(1+k)*k/2;
            }
        } else
        {
            int k=0;
            for(int i=0;i<l;i++)
               if(nums[i]==1) pos[++k]=i;
            for(int i=1;i+goal-1<=k;i++)
            {
                int s=pos[i];
                int t=pos[i+goal-1];
                int num1=1;
                int num2=1;               
                while(s-1>=0 && nums[s-1]==0) {num1++; s--;}
                while(t+1<l && nums[t+1]==0) {num2++; t++;}
                res+=num1*num2;             
            }
        }
        return res;
    }
};

官网解答:https://leetcode-cn.com/problems/binary-subarrays-with-sum/solution/he-xiang-tong-de-er-yuan-zi-shu-zu-by-le-5caf/

class Solution {
public:
    int numSubarraysWithSum(vector<int>& nums, int goal) {
        int sum = 0;
        unordered_map<int, int> cnt;
        int ret = 0;
        for (auto& num : nums) {
            cnt[sum]++;
            sum += num;
            ret += cnt[sum - goal];
        }
        return ret;
    }
};
原文地址:https://www.cnblogs.com/stepping/p/14986230.html