###### 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 的遍歷都能找到以該位置為結尾的所有合法子數組。