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

LeetCode 2302: Count Subarrays With Score Less Than K

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

基本資料
#

難易度: hard 第一次嘗試:2026-01-18

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

解題思路
#

score = sum × length,所有數都是正的,所以視窗變大時總和和長度都變大,分數單調遞增。

用「數子陣列」的滑動視窗:

  • 右端加入,分數 >= k 就縮左邊。
  • 以 right 結尾的合法子陣列有 right - left + 1 個。

我的解法
#

class Solution:
    def countSubarrays(self, nums: List[int], k: int) -> int:
        left = total = count = 0
        for right, x in enumerate(nums):
            total += x
            while total * (right - left + 1) >= k:
                total -= nums[left]
                left += 1
            count += right - left + 1
        return count

left 可能超過 right(單一元素的分數就 >= k),這時 right - left + 1 是 0,視窗是空的,下一輪會從 left 重新開始。

複雜度
#

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

要特別避免的錯誤
#

  • 題目是嚴格小於 k,縮視窗的條件是 >= k。
  • 用暴力枚舉:n 到 10^5。

面試口說整理
#

分數是總和乘長度,數字都是正的,所以視窗越大分數越大。我用滑動視窗,分數大於等於 k 就縮左邊,以右端結尾的合法子陣列有 right - left + 1 個,全部加起來。時間 O(n)。

相關文章

LeetCode 2968: Apply Operations to Maximize Frequency Score
·1 分鐘
LeetCode Hard Sliding-Window Sorting Prefix-Sum Binary-Search Array
LeetCode 2968 解題筆記:排序後,把一段全部變成同一個值,最省的目標是中位數;用前綴和 O(1) 算花費,花費隨視窗變大而變大,可以滑動
LeetCode 2106: Maximum Fruits Harvested After at Most K Steps
·1 分鐘
LeetCode Hard Sliding-Window Prefix-Sum Binary-Search Array
LeetCode 2106 解題筆記:採到的一定是連續一段水果;走完 [L, R] 的最少步數是 (R - L) + min(|start - L|, |R - start|),在水果陣列上用滑動視窗
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 3413: Maximum Coins From K Consecutive Bags
·2 分鐘
LeetCode Medium Sliding-Window Greedy Sorting Prefix-Sum Binary-Search Array
LeetCode 3413 解題筆記:最佳的 k 個袋子,一定有一端對齊某段的端點;分別算「左端對齊段的起點」和「右端對齊段的終點」(鏡像後重用同一個函式)
LeetCode 2009: Minimum Number of Operations to Make Array Continuous
·1 分鐘
LeetCode Hard Sliding-Window Hash-Table Binary-Search Array
LeetCode 2009 解題筆記:最後的陣列是長度 n 的連續整數;去重排序後,用滑動視窗找值域寬度 <= n - 1 的最多不同值,其他都要改