###### tags: `LeetCode`,`Python3`,`Medium`
# 930. Binary Subarrays With Sum
### **題目連結:** [**Binary Subarrays With Sum**](https://leetcode.com/problems/binary-subarrays-with-sum/?envType=daily-question&envId=2024-03-15)
### **解題方向**
* 我們使用兩個指針 left1 和 left2,以及兩個變數 sum1 和 sum2 來追蹤子數組的和
* left1 和 left2 分別代表了合法子數組的開始位置
* 而 sum1 和 sum2 則分別代表了以 left1 和 left2 為開始位置的子數組的和
* 接下來,我們使用一個 for 迴圈遍歷整個數組 nums,同時更新 sum1 和 sum2。
* 當 sum2 > goal 時,我們減去 left2 所指向的元素,直到 sum2 不再大於 goal。這確保了以 left2 為開始位置的子數組的和小於或等於 goal。
* 然後,當 sum1 >= goal 且 left1 <= i 時,我們減去 left1 所指向的元素,直到 sum1 不再大於或等於 goal,同時保持 left1 不超過 i。這確保了以 left1 為開始位置的子數組的和等於 goal。
* 最後,我們計算符合條件的子數組的數量,並將其累加到 ans 變數中。這樣就完成了對所有子數組的遍歷和計算。
### **完整程式碼**
```Python3=
class Solution:
def numSubarraysWithSum(self, nums: List[int], goal: int) -> int:
sum1, sum2, left1, left2, ans = 0, 0, 0, 0, 0
# left1 合法開頭
# left2 合法結尾
for i in range(len(nums)):
sum1 += nums[i]
sum2 += nums[i]
# 合法 window 的開頭
while sum2 > goal:
sum2 -= nums[left2]
left2 += 1
# 合法 window 的結尾+1
while sum1 >= goal and left1 <= i:
sum1 -= nums[left1]
left1 += 1
ans += left1 - left2
return ans
```
### **註記**
```Python3=18
ans += left1 - left2
```
這裡 left1 - left2 的含義是表示在目前的右指針位置 i 下,從 left2 到 left1 之間的範圍內有多少個合法的子數組。當 left1 和 left2 向右移動時,子數組的範圍會不斷地從 left2 到 left1 之間變化,而 left1 - left2 就代表了這個範圍內的子數組數量。
這是因為當 sum1 恰好等於 goal 時,left1 會向右移動,但 left2 也可能會向右移動,從而導致子數組的範圍變化。因此,left1 - left2 的差值代表了目前位置 i 下的合法子數組的數量。
這樣的處理方式確保了對每個位置 i 的遍歷都能找到以該位置為結尾的所有合法子數組。