[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

相关文章
相关标签/搜索