[Leetcode題解]和爲K的子數組

image.png

解法1:暴力求解

從前日後求和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

相關文章
相關標籤/搜索