周賽356。

題目

輸入由正整數陣列nums。

如果一個子陣列滿足以下條件,則稱為完整的

  • 子陣列中不同的元素個數與原陣列相同

求有多少完整的子陣列。

解法

測資範圍不大,窮舉所有子陣列,並計算其不同的元素個數,若和原陣列相同則答案+1。

時間複雜度O(N^2)。
空間複雜度O(N)。

class Solution:
    def countCompleteSubarrays(self, nums: List[int]) -> int:
        N=len(nums)
        dis=len(set(nums))
        ans=0
        for i in range(N):
            s=set()
            for j in range(i,N):
                s.add(nums[j])
                if len(s)==dis:
                    ans+=1
                    
        return ans

如果測資再大一些,上免方法就不能用了。

長度為N的陣列中,總共有tot = N*(N+1)/2個子陣列。
只要找到全部的不同元素各數與原陣列不同的子陣列,從tot中扣掉,剩下的就是答案。

時間複雜度O(N)。
時間複雜度O(N)。

class Solution:
    def countCompleteSubarrays(self, nums: List[int]) -> int:
        N=len(nums)
        tot=N*(N+1)//2
        dis=len(set(nums))
        
        ans=0
        left=0
        d=Counter()
        for right,x in enumerate(nums):
            d[x]+=1
            while len(d)==dis:
                d[nums[left]]-=1
                if d[nums[left]]==0:
                    del d[nums[left]]
                left+=1
            ans+=right-left+1
                
        return tot-ans