↓快轉到主要內容
  1. LeetCode/

LeetCode 930: Binary Subarrays With Sum

·1 分鐘· ·
LeetCode Medium Sliding-Window Prefix-Sum Hash-Table Array
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2026-01-20

  • 提交紀錄:Accepted(一次通過)

解題思路
#

跟 LeetCode 1248 一樣:陣列裡有 0,「和剛好是 goal」時視窗加入 0 總和不變,不單調。改成兩次「最多」相減。

goal = 0 時,at_most(-1) 要回傳 0(不能讓視窗縮成負的長度)。

我的解法
#

class Solution:
    def numSubarraysWithSum(self, nums: List[int], goal: int) -> int:
        def at_most(limit: int) -> int:
            if limit < 0:
                return 0
            left = total = count = 0
            for right, x in enumerate(nums):
                total += x
                while total > limit:
                    total -= nums[left]
                    left += 1
                count += right - left + 1
            return count

        return at_most(goal) - at_most(goal - 1)

前綴和的寫法:count[prefix - goal] 加總,跟 1248 一樣。

複雜度
#

時間 O(n),空間 O(1)。

要特別避免的錯誤
#

  • goal = 0 時 at_most(-1) 要特判回傳 0。

面試口說整理
#

陣列裡有 0,剛好等於 goal 不單調,所以我算「和最多 goal」減「和最多 goal - 1」,最多型用滑動視窗,以右端結尾的合法子陣列有 right - left + 1 個。goal 是 0 時,最多 -1 的數量是 0。也可以用前綴和加雜湊表。時間 O(n)。

相關文章

LeetCode 2875: Minimum Size Subarray in Infinite Array
·1 分鐘
LeetCode Medium Sliding-Window Prefix-Sum Hash-Table Array
LeetCode 2875 解題筆記:先拿掉 target // sum 個完整週期,剩下的餘數比一整圈小,一定能在兩份 nums 接起來的陣列裡用滑動視窗找到
LeetCode 1248: Count Number of Nice Subarrays
·2 分鐘
LeetCode Medium Sliding-Window Prefix-Sum Hash-Table Array
LeetCode 1248 解題筆記:「剛好 k 個奇數」不單調,改成「最多 k 個」減「最多 k - 1 個」;或用前綴和 + 雜湊表
LeetCode 1838: Frequency of the Most Frequent Element
·1 分鐘
LeetCode Medium Sliding-Window Sorting Greedy Prefix-Sum Binary-Search Array
LeetCode 1838 解題筆記:排序後,把視窗裡的數都加到 nums[right] 的花費是 nums[right] × 長度 − 視窗總和;花費 > k 就縮左邊
LeetCode 2271: Maximum White Tiles Covered by a Carpet
·1 分鐘
LeetCode Medium Sliding-Window Greedy Sorting Prefix-Sum Binary-Search Array
LeetCode 2271 解題筆記:地毯的左端放在某段白磚的起點一定不會更差;排序後用雙指針,完整蓋住的段累加,最後一段只算部分
LeetCode 2958: Length of Longest Subarray With at Most K Frequency
·1 分鐘
LeetCode Medium Sliding-Window Hash-Table Array
LeetCode 2958 解題筆記:「求最長」的滑動視窗,剛加入的數字出現超過 k 次就縮左邊
LeetCode 2653: Sliding Subarray Beauty
·1 分鐘
LeetCode Medium Sliding-Window Hash-Table Array
LeetCode 2653 解題筆記:值域只有 -50 到 50,固定視窗用計數陣列維護,每個視窗從 -50 往上累加找第 x 小的負數