周賽318。滑動窗口經典題,關鍵在於如何把空元素從雜湊表中刪除。

題目

輸入一個整數陣列nums和整數k。求滿足以下條件的nums子陣列的最大和:

  • 子陣列長度k
  • 子陣列中所有元素都不重複

如果沒有滿足條件的子陣列,則回傳0。

解法

維護一個大小為k的滑動窗口,右邊加入一個元素,左邊就要出去一個。每次移動完檢查是否有重複元素,若無則以窗口內元素總和更新答案。

每個元素出入各一次,時間複雜度O(N)。最差情況下整個陣列元素都不重複,空間複雜度O(N)。

class Solution:
    def maximumSubarraySum(self, nums: List[int], k: int) -> int:
        d=Counter()
        sm=0
        l=0
        ans=0
        
        for r,n in enumerate(nums):
            sm+=n
            d[n]+=1
            if len(d)==k:
                ans=max(ans,sm)
            if r+1>=k:
                d[nums[l]]-=1
                if d[nums[l]]==0:del d[nums[l]]
                sm-=nums[l]
                l+=1
                
        return ans