每日一题,力扣leetcode Hot100之560.和为K的子数组

每日一题,力扣leetcode Hot100之560.和为K的子数组_第1张图片

解法一:

暴力解法循环直接判断从每个index开始的切片是否满足

class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        # 要求的连续子数组
        count = 0
        n = len(nums)

        for i in range(n):
            for j in range(i, n):
                if sum(nums[i:j+1]) == k:
                    count += 1
        
        return count

超时了,对于求和这部分进行优化

class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        # 要求的连续子数组
        count = 0
        n = len(nums)

        
        for i in range(n):
            sum = 0
            for j in range(i, n):
                sum += nums[j]
                if sum == k:
                    count += 1
        
        return count

依然超时,考虑其他方法

解法二:

哈希表+前缀和

每日一题,力扣leetcode Hot100之560.和为K的子数组_第2张图片

class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        # 要求的连续子数组
        count = 0
        n = len(nums)
        preSums = collections.defaultdict(int)
        preSums[0] = 1

        presum = 0
        for i in range(n):
            presum += nums[i]
            
            # if preSums[presum - k] != 0:
            count += preSums[presum - k]   # 利用defaultdict的特性,当presum-k不存在时,返回的是0。这样避免了判断

            preSums[presum] += 1  # 给前缀和为presum的个数加1
            
        return count

你可能感兴趣的:(leetcode,算法,职场和发展,python,java,c++,c语言)