Skip to content

Latest commit

 

History

History
95 lines (63 loc) · 2.66 KB

0560-subarray-sum-equals-k.adoc

File metadata and controls

95 lines (63 loc) · 2.66 KB

560. 和为 K 的子数组

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

子数组是数组中元素的连续非空序列。

示例 1:

输入:nums = [1,1,1], k = 2
输出:2

示例 2:

输入:nums = [1,2,3], k = 3
输出:2

提示:

  • 1 <= nums.length <= 2 * 104

  • -1000 <= nums[i] <= 1000

  • -107 <= k <= 107

思路分析

背后的想法如下:如果累积总和(由 sum[i] 表示加到 ith 的和)最多两个指数是相同的,那么这些元素之间的元素总和为零。进一步扩展相同的想法,如果累计总和,在索引 ij 处相差 k,即 sum[i]−sum[j]=k,则位于索引 ij 之间的元素之和是 k

基于这些想法,可以使用了一个哈希表 map,它用于存储所有可能的索引的累积总和以及相同累加和发生的次数。我们以以下形式存储数据:(sumisumi 的出现次数)。我们遍历数组 nums 并继续寻找累积总和。每当我们遇到一个新的和时,我们在 map 中创建一个与该总和相对应的新条目。如果再次出现相同的和,我们增加与 map 中的和相对应的计数。此外,对于遇到的每个总和,我们还确定已经发生 sum - k 总和的次数,因为它将确定具有总和 k 的子阵列发生到当前索引的次数。我们将 count 增加相同的量。

在完成遍历数组后,count 记录了所需结果

基于一个idea:sum[j] - sum[i] == k 的话,nums[i+1, j] 之间数字的和就是 k

{image_attr}
{image_attr}
{image_attr}
{image_attr}
{image_attr}
{image_attr}
{image_attr}
{image_attr}
{image_attr}
一刷
link:{sourcedir}/_0560_SubarraySumEqualsK.java[role=include]
二刷
link:{sourcedir}/_0560_SubarraySumEqualsK_2.java[role=include]
三刷
link:{sourcedir}/_0560_SubarraySumEqualsK_3.java[role=include]