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

目录
相关文章
|
2月前
|
存储
【动态规划】子数组系列
本文介绍了多个动态规划问题及其解决方案,包括最大子数组和、环形子数组的最大和、乘积最大子数组、乘积为正数的最长子数组长度、等差数列划分、最长湍流子数组、单词拆分及环绕字符串中唯一的子字符串。通过详细的状态定义、转移方程和代码实现,帮助读者理解每类问题的核心思路与解题技巧。
58 2
|
7月前
|
人工智能
被3乘除的子序列
被3乘除的子序列
25 0
|
7月前
|
算法 测试技术 C#
[二分查找]LeetCode2040:两个有序数组的第 K 小乘积
[二分查找]LeetCode2040:两个有序数组的第 K 小乘积
|
7月前
|
测试技术
leetcode-152:乘积最大子数组
leetcode-152:乘积最大子数组
64 0
|
7月前
leetcode-560:和为 K 的子数组
leetcode-560:和为 K 的子数组
55 0
|
7月前
leetcode-2104:子数组范围和
leetcode-2104:子数组范围和
46 0
|
算法 测试技术 C++
C++算法:二分查找旋转数组
C++算法:二分查找旋转数组
|
人工智能
LeetCode-2104 子数组范围和
LeetCode-2104 子数组范围和
|
存储 算法 Linux
【前缀和】560.和为 K 的子数组
暴力解法:我们很容易想到通过两个for循环去遍历数组中所有和的可能,之后来判断有几个满足K.他的代码十分的简单,所以这里直接给出.
60 0
|
存储 算法 Linux
【前缀和】974. 和可被 K 整除的子数组
同样的,本题利用了前缀和的定理.当(pre[i]-pre[j-1])mod k==0时.即为所寻找的答案.
62 0