從前日後求和sum[i]爲到第i項時候的和數組
那麼sum[i:j] = sum[j]-sum[i]spa
遍歷全部區間,用上面的公式快速求出各個區間的值,符合條件則結果+1code
class Solution(object): def subarraySum(self, nums, k): """ :type nums: List[int] :type k: int :rtype: int """ n = len(nums) sums = [x for x in nums] for index in range(1,n): sums[index] = sums[index-1]+nums[index] ans = 0 for start in range(n): for end in range(start,n): if sums[end]-sums[start]+nums[start]==k: ans+=1 return ans
時間複雜度:n^2 blog
解法2:哈希表索引
假如到第i個元素的時候,總和爲sum[i] 那麼 怎麼樣獲得連續的子數組使得子數組的值爲k呢? 很顯然,咱們能夠將sum[i]分爲兩部分:sum[i] = (sum[i]-k)+k,咱們在前邊已經獲得的sum[x],(0<=x<i)中找到能值等於sum[i]-k的那一個,顯然x+1到i部分的值就是k!,這樣的x有幾個,那麼到當前索引i的時候,就會有幾個子數組和爲k。it
因此作法以下:
遍歷nums,而且依次記錄累加和sum
使用哈希表d 記錄累加和出現的次數 (若是出現過+1,沒出現過=1)
查詢以當前元素結尾的和爲k的子數組有多少個,用sum[i]-k則獲得與目標k的差距,找到等於差距的累計和的個數,加到結果上io
代碼class
`object
class Solution(object): def subarraySum(self, nums, k): d = {0:1} sums = 0 ans = 0 for i in range(len(nums)): sums+=nums[i] find = sums-k # if find in d: ans+=d[find] if sums in d: d[sums]+=1 else: d[sums] = 1 return ans
`List
時間複雜度n