給你一個二元數組 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)。