LeetCode 560 和 K 的子阵列

小夏 科技 更新 2024-02-08

给定一个整数数组和一个整数 k,您需要找到该数组中总和为 k 的连续子数组的数量。

示例 1:

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

输出:2、1,1] 和 [1,1] 是两种不同的情况。

注意:数组的长度为 [1, 20,000]。

数组中元素的范围是 [-1000, 1000],整数 k 的范围是 [-1e7, 1e7]。

哈希表前缀和阿里腾讯字节的直观方法是暴力破解所有子数组,然后分别计算总和,如果等于 k,则计数为 +1这种做法的时间复杂度为 o(n 2),* 如下所示:

class solution: def subarraysum(self, nums: list[int], k: int) -int: cnt, n = 0, len(nums) for i in range(n): sum = 0 for j in range(i, n): sum += nums[j] if (sum == k): cnt += 1 return cnt
事实上,当我第一次看到这个问题时,我想,“有没有可能用推拉窗来解决它? ”。但我很快就放弃了,因为数组中的项范围为负值,这使得我们扩展或收缩窗口变得更加复杂。 第二个思路是给 sum 加上前缀,保存一个数组的前缀 sum,然后用 difference 方法推导任意区间的和,这是可行的,如下所示:

class solution: def subarraysum(self, nums: list[int], k: int) -int: cnt, n = 0, len(nums) pre = [0] *n + 1) for i in range(1, n + 1): pre[i] = pre[i - 1] +nums[i - 1] for i in range(1, n + 1): for j in range(i, n + 1): if (pre[j] -pre[i - 1] == k): cnt += 1 return cnt
但是,问题只是要求它而不必找到所有的子数组。 因此,我们可以直接使用以下时间复杂度为 $o(n)$ 的算法。

这种方法的核心点是,找到的子阵列总数实际上等于:

以索引 0 结尾的子数组数以索引 1 结尾的子数组数... 以索引 n - 1 结尾的子数组数和以索引 i 结尾的子数组数等于:前缀为 sum 的子数组数为 acc - k,其中 acc 是当前前缀的总和。 为了能够快速提取前缀和 acc - k 的数量,我们可以将其存储在哈希中。

具体算法:维护一个算力图,算力图的键是累积值 acc,该值是累积值 acc 的出现次数。 遍历数组,然后不断更新 acc 和哈希图,如果 acc 等于 k,那么很明显 +1如果hashmap[acc - k]存在,我们可以将其添加到结果中。 语言很难解释,所以我画了一个图表来说明 nums = [1,2,3,3,0,3,4,2], k = 6 的情况。

如图所示,当访问 nums[3] 时,hashmap 如图所示,计数为 2其中之一是[1,2,3],这很容易理解。 另一个是[3,3]。

这个 [3,3] 正是我们用 hashmap[acc - k] 得到的,即 hashmap[9 - 6]。

前缀,并可用于通过利用哈希映射记录的总和来避免重复计数语言支持: js, pythonj**ascript code:

/* *lc app=leetcode id=560 lang=j**ascript * 560] subarray sum equals k *//** param nums * param k * return */var subarraysum = function (nums, k) ;let acc = 0; let count = 0; for (let i = 0; i < nums.length; i++)if (hashmap[acc] === void 0) else }return count;};
python code:

class solution: def subarraysum(self, nums: list[int], k: int) -int: d = {}acc = count = 0 for num in nums: acc += num if acc == k: count += 1 if acc - k in d: count += d[acc-k] if acc in d: d[acc] += 1 else: d[acc] = 1 return count

相似文章

    K418具有较高的硬度和强度,K418B研究

    K INC 合金加工工艺 铸造工艺 K合金常采用真空电弧熔炼或真空感应熔炼铸造。在熔炼过程中,需要严格控制合金的成分和熔化温度,以确保合金的均匀性和纯度。熔模铸造 K合金可以通过熔模铸造方法获得形状复杂的零件。熔模铸造需要先制作石膏模具,然后将K合金在一定温度下熔化并倒入模具中冷却凝固。这种铸造方法...

    2k和4k显示器的选择,什么牌子的4K电脑显示器口碑好

    在当今的数字时代,显示分辨率已成为衡量视觉体验的重要指标。随着技术的不断进步,K和K显示器逐渐成为市场的主流。然而,面对这两种分辨率的选择,很多消费者陷入了纠结之中。本文将为您详细分析K和K显示器的优缺点,并帮助您找到最适合您的显示器分辨率。.K显示 .优点 细腻的画质 K分辨率 x 比p x 具有...

    Redmi K70 和 K60 的比较有什么区别

    Redmi K 和 K 细节在细节中 当我们站在数码产品的十字路口,面对两款相似的手机 Redmi K和K时,如何选择就成了摆在我们面前的难题。本文将为您详细比较这两款手机之间的差异,以帮助您做出明智的选择。.设计 传承与创新。Redmi K在外观设计方面延续了Redmi系列的经典元素,同时也进行了...

    衡量绩效的最重要的 ASO 指标和 KPI 是什么?

    应用程序的成功不是一蹴而就的,需要大量的时间 工作和金钱。接下来,Pomelo 将根据自己的经验与老板们分享哪些指标对 App Store 和 Google Play 最重要。我们首先需要知道的是应用程序增长目标的 个核心要素,这也是增长的五个阶段。 可见性。 转换。 成长。 用户反馈。 货币化。应...

    2k和4k显示器的区别,现在买4K电脑显示器哪个牌子比较好

    随着技术的发展,显示器的分辨率也在不断提高,K和K已成为当前显示器市场的主流选择。那么,这两种分辨率到底有什么区别呢?让我们一起来探索高清世界的奥秘。一 分辨率的差异 首先,我们要明白,K和K指的是显示器的分辨率。K分辨率是指屏幕的水平像素达到以上,常见的有 等K分辨率是指屏幕的水平像素达到或接近,...