快轉到主要內容
  1. LeetCode/

LeetCode 2799: Count Complete Subarrays in an Array

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

基本資料
#

難易度: medium 第一次嘗試: 2025-04-24

  • 總花費時間:15:00.00 第二次嘗試: 2025-07-01
  • 總花費時間:10:00.00

解題思路
#

這題的陣列長度相對較小,
所以可以直接使用暴力法,雙層遍歷陣列來統計符合條件的子陣列數量。
不過有一個更優化的方法:
當我們從起始索引遍歷到結尾索引時,
一旦目前的子陣列已經符合「完整子陣列」的條件,
就可以立刻停止內層迴圈,並直接統計從當前結尾索引到陣列末尾的所有子陣列數量。
這樣可以有效避免 TLE(超時)問題。

另外還有一種使用滑動窗口的方法,我們可以用雜湊表記錄每個元素的出現次數,當不同元素的數量與原陣列中不同元素的數量相符時,就表示這個子陣列符合完整子陣列的條件。在找到最小的完整子陣列後,從右邊索引到陣列末尾的所有子陣列也都是完整子陣列,因此我們可以計算數量並繼續遍歷。

解法
#

方法一:優化暴力法
#

class Solution:
    def countCompleteSubarrays(self, nums):
        distinct_elements = set(nums)
        total_distinct = len(distinct_elements)
        count = 0
        n = len(nums)
        
        for i in range(n):
            current_set = set()
            for j in range(i, n):
                current_set.add(nums[j])
                if len(current_set) == total_distinct:
                    count += (n - j)
                    break
        return count

方法二:滑動窗口
#

class Solution:
    def countCompleteSubarrays(self, nums):
        distinct_elements = set(nums)
        total_distinct = len(distinct_elements)
        count = 0
        n = len(nums)
        
        # 使用滑動窗口和雙指針
        left = 0
        element_count = {}
        
        for right in range(n):
            # 將當前元素加入計數
            element_count[nums[right]] = element_count.get(nums[right], 0) + 1
            
            # 當我們擁有所有不同元素時,嘗試最小化窗口
            while len(element_count) == total_distinct:
                # 從 left 到 right(包含)到末尾的所有子陣列都是完整的
                count += (n - right)
                
                # 移除最左邊的元素
                element_count[nums[left]] -= 1
                if element_count[nums[left]] == 0:
                    del element_count[nums[left]]
                left += 1
                
        return count

收穫
#

NA

遇到的問題
#

NA

相關文章

LeetCode 2145: Count the Hidden Sequences
·1 分鐘
LeetCode Daily Medium
LeetCode 解題紀錄
LeetCode 781: Rabbits in Forest
·1 分鐘
LeetCode Daily Medium
LeetCode 解題紀錄
LeetCode 560: Subarray Sum Equals K
·1 分鐘
LeetCode Daily Medium
LeetCode 解題紀錄
LeetCode 1922: Count Good Numbers
·1 分鐘
LeetCode Daily Medium
LeetCode 解題紀錄
LeetCode 1399: Count Largest Group
·1 分鐘
LeetCode Daily Easy
LeetCode 解題紀錄
LeetCode 2325: Decode the Message
·1 分鐘
LeetCode Daily Easy
LeetCode 解題紀錄