LeetCode - 560. 和爲K的子數組(python)

560. 和爲K的子數組

給定一個整數數組和一個整數 k,你需要找到該數組中和爲 k 的連續的子數組的個數。

示例 1 :
輸入:nums = [1,1,1], k = 2
輸出: 2 , [1,1] 與 [1,1] 爲兩種不同的情況。

說明 :
數組的長度爲 [1, 20,000]。
數組中元素的範圍是 [-1000, 1000] ,且整數 k 的範圍是 [-1e7, 1e7]。

解題:

# 一開始採用暴力解法,超出了時間限制
class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        result=0
        for i in range(len(nums)):
            s=nums[i]
            if s==k:
                result+=1
            for j in range(i+1,len(nums)):
                s+=nums[j]
                if s==k:
                    result+=1
        return result
# 改爲如下代碼
def subarraySum(nums, k):
    dic = {}
    # 注意此處如果沒有dic[0]=1的話,後面必須要有對單個元素等於k的判斷;如果有判斷的話則不需要dic[0]=1
    # dic[0]=1
    acc, res = 0, 0
    for num in nums:
        acc += num
        if acc == k:
            res += 1
        if acc - k in dic:
            res += dic[acc - k]
        dic[acc] = dic.get(acc, 0) + 1
    return res

總結:

  1. 注意數組元素並不都大於0。
  2. 注意只有一個元素就滿足k的情況。
  3. dict.get(key, default=None),參數:key – 字典中要查找的鍵。default – 如果指定鍵的值不存在時,返回該默認值。
  4. 字典:dic={}。
  5. 前綴和:該元素位置之前所有元素的總和。
  6. i到j之間子數組總和爲k,則nums[j]-nums[i-1]=k,則有nums[i-1]=nums[j]-k,所以判斷當前元素與k之間的差值是否是前若干元素總和即可,注意計數時並不都是+1,如果前若干元素總和=nums[j]-k的子數組個數大於1,則要全部加上,因爲是不同的子數組。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章