给你一个二元数组 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^44
nums[i] 不是 0 就是 1
0 <= goal <= nums.length
滑动窗口,找出和大于等于goal的子数组数量以及和大于等于goal+1的子数组数量,两者相减即为和等于goal的子数组数量:
class Solution {
public:int numSubarraysWithSum(vector<int>& nums, int goal) {return getNum(nums, goal) - getNum(nums, goal + 1);}int getNum(vector<int> &nums, int target) {if (target == 0) {return nums.size() * (nums.size() + 1) / 2;}int left = 0;int ans = 0;int sum = 0;for (int i = 0; i < nums.size(); ++i) {sum += nums[i];while (sum >= target) {sum -= nums[left];++left;}ans += left;}return ans;}
};
如果nums的大小为n,则此算法时间复杂度为O(n),空间复杂度为O(1)。