快轉到主要內容
  1. LeetCode/

LeetCode 1343: Number of Sub-arrays of Size K and Average Greater than or Equal to Threshold

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

基本資料
#

難易度: medium 第一次嘗試: 2025-08-02

  • 總花費時間:00:00.00

問題描述
#

給定一個整數陣列 arr 和兩個整數 kthreshold,返回大小為 k 且平均值大於或等於 threshold 的子陣列數量。子陣列的平均值是所有元素總和除以子陣列中的元素數量。

解題思路
#

這是一個經典的固定大小滑動窗口問題。我們需要維持一個大小為 k 的窗口並計算窗口內元素的總和。與其直接計算平均值,我們可以通過預先計算所需的最小總和 (k * threshold) 並將窗口總和與此值進行比較來優化。這避免了浮點運算並使比較更高效。

解法
#

固定大小滑動窗口與總和優化
#

class Solution:
    def numOfSubarrays(self, arr: List[int], k: int, threshold: int) -> int:
        min_sum = k * threshold  # 預先計算所需的最小總和
        sum_now = 0
        res = 0

        for i in range(len(arr)):
            sum_now += arr[i]
            
            # 移除落在窗口外的元素
            if i - k >= 0:
                sum_now -= arr[i - k]

            # 檢查當前窗口是否滿足閾值要求
            if i - k + 1 >= 0 and sum_now >= min_sum:
                res += 1

        return res

演算法分析
#

時間複雜度
#

  • 時間: O(n),其中 n 是輸入陣列的長度
  • 空間: O(1),因為我們只使用常數量的額外空間

關鍵優化
#

  1. 預先計算閾值: 與其每次都計算平均值,我們預先計算 min_sum = k * threshold
  2. 整數比較: 使用總和比較而不是平均值計算,避免浮點運算
  3. 單次遍歷: 我們只需要遍歷陣列一次

收穫
#

  1. 固定大小滑動窗口: 這道題展示了經典的固定大小滑動窗口技巧,我們維持一個恰好大小為 k 的窗口並在陣列中滑動。

  2. 總和 vs 平均值優化: 與其為每個窗口計算平均值(需要除法),我們預先計算所需的最小總和 (k * threshold) 並直接比較總和。這更高效並避免浮點精度問題。

  3. 窗口管理: 關鍵洞察是通過添加新元素和移除舊元素來維持正確的窗口大小,當窗口超過大小 k 時。

  4. 邊界條件: 條件 i - k + 1 >= 0 確保我們只有在有完整的大小為 k 的窗口時才開始計算結果。

  5. 整數運算: 使用整數運算進行比較更高效,避免平均值計算可能發生的浮點精度錯誤。

  6. 單次遍歷: 解決方案只需要遍歷陣列一次,對於大型輸入非常高效。

  7. 記憶體效率: O(1) 空間複雜度使這個解決方案非常記憶體高效,因為我們只需要幾個變數來追蹤當前總和和結果計數。

  8. 邊界情況處理: 解決方案自然地處理陣列長度小於 k 的邊界情況,通過永遠找不到有效窗口。

遇到的問題
#

相關文章

LeetCode 567: Permutation in String
·2 分鐘
LeetCode Daily Medium String Sliding-Window Hash-Map Frequency-Counting Permutation
LeetCode 解題紀錄 - 使用字符頻率的滑動窗口
LeetCode 438: Find All Anagrams in a String
·2 分鐘
LeetCode Daily Medium String Sliding-Window Hash-Map Anagram Frequency-Counting
LeetCode 解題紀錄 - 使用字符頻率的滑動窗口
LeetCode 2090: K Radius Subarray Averages
·1 分鐘
LeetCode Daily Medium Sliding-Window
LeetCode 解題紀錄
LeetCode 3: Longest Substring Without Repeating Characters
·1 分鐘
LeetCode Daily Medium Sliding-Window Hash-Map
LeetCode 解題紀錄
LeetCode 713: Subarray Product Less Than K
·1 分鐘
LeetCode Daily Medium Sliding-Window
LeetCode 解題紀錄
LeetCode 2799: Count Complete Subarrays in an Array
·1 分鐘
LeetCode Daily Medium Sliding-Window
LeetCode 解題紀錄