和为K的子数组

简介: 和为K的子数组

给定一个数组在给定一个整数,我们如何找出数组中和为这个整数的子数组呢?


问题

给你一个整数数组nums和一个整数k,请你统计并返回该数组中和为k的连续子数组的个数。


方法

前缀和:

前缀和是一种预处理,用于降低查询时的时间复杂度。举个例子:给定n个整数,然后进行n次询问,每次询问求一个区间内值的和。

创建一个字典dict,从第一位依次求和,即第一次求和是第一个数,第二次求和是第一和第二个数的和,第三次求和是一到三位数的和,以此类推。计算每一次的和出现次数,在字典中,和设为value,出现的次数设为key。在计算时,用每一次的和cur-sum减去k,再查找字典dict,中cur-sum - k值出现的次数,累加并返回,即为和为k 的连续子数组的个数。


通过实验、实践等证明提出的方法是有效的,是能够解决开头提出的问题。

代码清单 1

classs Solution:
def subrraySum(self,nums:List[int],k:int) -> int:
   cur_sum=0
   dict={}
   dict[0]=1
   count=0
   for num in nums:
       cur_sum+=num
       if cur_sum - k in dict:
           count+=dict[cur_sum - k]
       if cur_sum in dict:
dict[cur_sum]+=1
           else:
dict[cur_sum]+=1
       return count


结语

针对和为K的子数组问题,提出前缀和的方法,证明该方法是有效的,是否还有其他方法呢?是我们值得思考的,必然存在其他方法也能去解决,需要自己不断探索。

目录
相关文章
|
5月前
|
测试技术
leetcode-152:乘积最大子数组
leetcode-152:乘积最大子数组
56 0
|
5月前
leetcode-560:和为 K 的子数组
leetcode-560:和为 K 的子数组
47 0
|
5月前
leetcode-2104:子数组范围和
leetcode-2104:子数组范围和
39 0
|
5月前
leetcode-1800:最大升序子数组和
leetcode-1800:最大升序子数组和
37 0
|
人工智能
LeetCode-2104 子数组范围和
LeetCode-2104 子数组范围和
|
存储 算法 Linux
【前缀和】560.和为 K 的子数组
暴力解法:我们很容易想到通过两个for循环去遍历数组中所有和的可能,之后来判断有几个满足K.他的代码十分的简单,所以这里直接给出.
49 0
力扣 713. 乘积小于 K 的子数组
力扣 713. 乘积小于 K 的子数组
60 0
|
存储 算法 Linux
【前缀和】974. 和可被 K 整除的子数组
同样的,本题利用了前缀和的定理.当(pre[i]-pre[j-1])mod k==0时.即为所寻找的答案.
51 0