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
總結:
- 注意數組元素並不都大於0。
- 注意只有一個元素就滿足k的情況。
- dict.get(key, default=None),參數:key – 字典中要查找的鍵。default – 如果指定鍵的值不存在時,返回該默認值。
- 字典:dic={}。
- 前綴和:該元素位置之前所有元素的總和。
- i到j之間子數組總和爲k,則nums[j]-nums[i-1]=k,則有nums[i-1]=nums[j]-k,所以判斷當前元素與k之間的差值是否是前若干元素總和即可,注意計數時並不都是+1,如果前若干元素總和=nums[j]-k的子數組個數大於1,則要全部加上,因爲是不同的子數組。