1. 題目
給定一個整數數組和一個整數 k,你需要找到該數組中和爲 k 的連續的子數組的個數。
示例 1 :
輸入:nums = [1,1,1], k = 2
輸出: 2 , [1,1] 與 [1,1] 爲兩種不同的情況。
說明 :
數組的長度爲 [1, 20,000]。
數組中元素的範圍是 [-1000, 1000] ,且整數 k 的範圍是 [-1e7, 1e7]。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/subarray-sum-equals-k
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
2. 題解
用字典 sum_dict[val] = i
,記錄從左邊元素,累加到第i
個元素的和val
;
然後,遍歷val_i - val_j = k
;且val_i
的索引比val_j
的索引大的個數。
代碼
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
# 找 val_i - val_j == k;i>j;
# 放入dict中查找
sum_dict = {}
s = 0
for i in range(len(nums)):
s += nums[i]
if s in sum_dict:
sum_dict[s].append(i)
else:
sum_dict[s] = [i]
ans = 0
for val in sum_dict.keys():
if val == k:
ans += len(sum_dict[val])
if (val-k) in sum_dict.keys():
val_list = sum_dict[val]
val_k_list = sum_dict[val-k]
for i in val_list:
for j in val_k_list:
if i>j:
ans += 1
return ans