leetcode--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

思路

  1. 前缀和(Prefix Sum)
    前缀和是一个数组处理技巧,用于快速计算数组中任意区间的和。对于数组nums,我们定义prefixSum[i]nums中前i个元素的和,即prefixSum[i] = nums[0] + nums[1] + ... + nums[i-1]。通过前缀和,我们可以快速计算任意区间[i, j]的和,即sum[i, j] = prefixSum[j+1] - prefixSum[i]

  2. 哈希表(HashMap)
    哈希表是一种高效的数据结构,用于存储键值对。在这个问题中,我们使用哈希表来记录前缀和的出现次数。键是前缀和的值,值是该前缀和出现的次数。

  3. 算法步骤

    • 初始化一个哈希表prefixSumCount,用于记录前缀和的出现次数。初始时,我们将0作为键,1作为值放入哈希表,表示前缀和为0的情况已经出现了一次。

    • 初始化一个变量count,用于记录和为k的子数组的个数。

    • 初始化一个变量prefixSum,用于记录当前的前缀和。

    • 遍历数组nums,对于每个元素num,更新prefixSumprefixSum + num

    • 检查prefixSum - k是否在哈希表中。如果在,说明存在一个子数组,其和为k,因为prefixSum - (prefixSum - k) = k。我们将哈希表中prefixSum - k对应的值加到count上。

    • 更新哈希表中当前前缀和prefixSum的出现次数,如果prefixSum已经存在,则将其值加1,如果不存在,则将其值设为1

    • 遍历结束后,count即为和为k的子数组的个数。

  4. 时间复杂度
    该算法的时间复杂度为O(n),其中n是数组nums的长度。这是因为我们只对数组进行了一次遍历,并且在哈希表中的操作都是常数时间的。

  5. 空间复杂度
    空间复杂度为O(n),这是因为我们使用了一个哈希表来存储前缀和的出现次数,在最坏的情况下,每个前缀和都不同,哈希表的大小将和数组的长度成正比。

图解

 代码

  public static int subarraySum(int[] nums, int k) {HashMap<Integer,Integer> map = new HashMap<>();/*目的是如果第一个元素就是目标值,那么我们找prefixSum - k的时候,可以得到1,也就是让次数可以++。如果没有这行代码 我们将无法找到前缀和为0的记录,从而无法正确地增加 count 的值*/map.put(0,1);int prefixSum = 0;int count = 0;for(int i: nums){prefixSum += i;//之所以是这种顺序是因为,是因为从之前的前缀数组中的某个点到当前点的子数组的和等于 k//至于具体为什么,如果先更新map,更新完成后,判断map中是否存在prefixSum - k ,恰好存在,且值恰好为当前的前缀和,并不能得出一定会有相加为K的子数组,// 只有在map中没有当前前缀和的时候,才能判断出有相加为K的子数组if(map.containsKey(prefixSum - k)){count += map.get(prefixSum);}map.put(prefixSum,map.getOrDefault(prefixSum,0)+1);}return count;}

问题

顺序问题

在这里讲讲 为什么要先 if 条件判断,再往 map 添加键值对。

始终注意一点:

当我们计算当前的前缀和 prefixSum 时,我们检查是否存在一个前缀和 prefixSum - k 在哈希表中。如果存在,这意味着在原数组 nums 中,从某个点到当前点的子数组的和等于 k

说的再精确一点,就是从不包括当前节点的前缀和中的某个点,到当前点的子数组和为K。

具体表现就在于:如果先更新map,更新完成后,判断map中是否存在prefixSum - k ,如果恰好存在,且值恰好为算上当前节点的前缀和,但是这样并不能得出一定会有和相加为K的子数组,只有在map中没有当前前缀和的时候,才能判断出有相加和为K的子数组。

count 累加问题

举个例子来说明:

假设我们有数组 nums = [1, 2, 3, -1, 2],我们要找和为 k = 3 的子数组。

  • 当我们遍历到索引2(值为3)时,prefixSum 是6,prefixSum - k 是3,而哈希表中已经有前缀和3的记录,且出现次数为1。这意味着从索引0到索引2的子数组和为3,所以我们增加 count 的值为1。

  • 当我们继续遍历到索引4(值为2)时,prefixSum 是8,prefixSum - k 是5,而哈希表中已经有前缀和5的记录,且出现次数为1。这意味着从索引1到索引4的子数组和为3,所以我们再次增加 count 的值为1。

因此,count 的值反映了和为 k 的子数组的总数量,而不是每次发现一个子数组就简单地加1。

初始化问题

举个例子来说明:

假设我们有数组 nums = [3, 2, 1, 2],我们要找和为 k = 3 的子数组。

  • 当我们遍历到索引0(值为3)时,prefixSum 是3,prefixSum - k 是0,而哈希表中已经有前缀和0的记录,且出现次数为1。这意味着从索引0到索引0的子数组和为3,所以我们增加 count 的值为1。

如果没有 prefixSumCount.put(0, 1); 这一行,那么在第一次迭代时,我们将无法找到前缀和为0的记录,从而无法正确地增加 count 的值。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/11028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据分析需要注意哪些法律法规

数据分析 前言一、数据处理过程二、数据收集阶段的法律规则数据收集应具备合法、正当、透明原则数据收集应坚持最小必要原则数据收集应遵守知情-同意规则数据收集应遵守目的明确性要求 三、数据储存的法律规则四、数据使用与处理的阶段的法律规则数据安全保护义务按照数据分级分…

【Python快速上手(二十一)】

目录 Python快速上手&#xff08;二十一&#xff09;Python3 使用数据库-mysql-connector1. 创建数据库连接2. 创建数据表3. 插入数据4. 查询数据5. 使用 WHERE 条件语句6. 排序7. 删除记录8. 更新表数据9. 删除表10.异常处理总结 Python快速上手&#xff08;二十一&#xff09…

【荣耀笔试题汇总】2024-05-11-荣耀春招笔试题-三语言题解(CPP/Python/Java)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新小米近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f49…

wifi无线使用adb

要通过Wi-Fi使用ADB连接安卓设备&#xff0c;可以遵循以下步骤进行操作&#xff1a; 通过USB连接设备&#xff1a; 首先&#xff0c;确保你的安卓设备通过USB数据线连接到电脑&#xff0c;并开启USB调试模式。你可以通过进入手机的设置 -> 开发者选项来启用USB调试。 切换…

【漏洞复现】泛微OA E-Cology portalTsLogin文件读取漏洞

漏洞描述&#xff1a; 泛微E-Cology是一款面向中大型组织的数字化办公产品&#xff0c;它基于全新的设计理念和管理思想&#xff0c;旨在为中大型组织创建一个全新的高效协同办公环境。泛微OA E-Cology portalTsLogin存在任意文件读取漏洞&#xff0c;允许未经授权的用户读取服…

了解当前经济,VBA一键获取不同货币实时汇率

了解当前经济数据,VBA一键获取不同货币间实时汇率 当下较火的经济新闻:黄金价格、日元贬值、美元加息等,咱们不去分析了解这些经济变动背后的动机及原因,做一点本份的事,如何用VBA获取不同货币之间的实时汇率。这肯定是需要联网的,现从“外汇查询” 网站(https://www.wa…

UnitTest / pytest 框架

文章目录 一、UnitTest框架1. TestCase使用2. TestSuite 和 TestRunner3. TestLoader4. Fixture装置5. UnitTest断言1. 登录案例 6. 参数化1. parameterized插件 7. unitTest 跳过 二、pytest 框架1. 运行方式3.读取配置文件(常用方式) 2. pytest执行用例的顺序1. 分组执行(冒烟…

重学JavaScript核心知识点(二)—— 详解Js中的模块化

详解Js中的模块化 1. 模块化的背景2. 来看一个例子3. 优雅的做法 —— 创建模块对象4. 模块与类&#xff08;class&#xff09;5. 合并模块6. 动态加载模块 1. 模块化的背景 JavaScript 在诞生之初是体积很小的&#xff0c;早期&#xff0c;它们大多被用来执行独立的脚本任务&…

考研数学|强化阶段怎么刷《660》《880》《1000》?

强化阶段想要刷好题&#xff0c;首先要选一本适合自己的题集&#xff01; 一般在强化阶段&#xff0c;大家用多个最多的题集就是660题&#xff0c;880题还有1000题 660题的特点是只训练客观题&#xff0c;虽然题目的质量很高&#xff0c;但是训练面还是比较窄 880题是综合训…

【java】java面试题与题解

1.下列代码的输出是什么 public static void main(String[] args) {int a;a 6;System.out.print(a);System.out.print(a);System.out.print(a); } 答案&#xff1a;667 解析&#xff1a;a运算首先将a进行对应操作(即输出)&#xff0c;然后将a的值1。所以输出仍为6&#xff…

云器Lakehouse:Multi-Cluster弹性架构如何实现湖上高并发低延迟分析

导读 在当今快速发展的大数据时代&#xff0c;数据平台的性能和效率对于企业来说至关重要。云器Lakehouse的Multi-Cluster弹性架构为我们提供了一种全新的视角&#xff0c;以应对数据湖上高并发和低延迟分析的挑战。本文将深入探讨云器Lakehouse如何通过其独特的技术理念和架构…

鸿蒙开发学习:初探【ArkUI-X】

ArkTS 是华为自研的开发语言。它在TypeScript&#xff08;简称TS&#xff09;的基础上&#xff0c;匹配 ArkUI 框架&#xff0c;扩展了声明式 UI 、状态管理等相应的能力&#xff0c;让开发者以更简洁、更自然的方式开发跨端应用。 ArkUI-X 进一步将 ArkUI 扩展到了多个 OS 平台…

线程同步--条件变量,信号量

生产者和消费者模型 案例 /*生产者消费者模型&#xff08;粗略的版本&#xff09; */ #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <unistd.h>// 创建一个互斥量 pthread_mutex_t mutex;struct Node{int num;struct Node …

js的桶排序

桶排序&#xff08;Bucket Sort&#xff09;是一种分布式排序算法&#xff0c;它将元素分散到一系列桶中&#xff0c;然后对每个桶中的元素进行排序&#xff0c;并将所有的桶合并起来得到最终的排序结果。桶排序适用于输入的元素均匀分布在一个范围内的情况&#xff0c;它的时间…

DELL T630服务器iDRAC分辨率调整办法

对于Dell T630服务器的iDRAC分辨率调整&#xff0c;您需要登录到iDRAC的Web界面。以下是详细的步骤&#xff1a; 登录iDRAC&#xff1a;在浏览器中输入iDRAC的IP地址&#xff0c;然后使用用户名&#xff08;通常是“root”&#xff09;和密码登录。 导航到虚拟控制台&#xff…

Java中数组的特点、弊端与集合框架的使用

Java中数组的特点、弊端与集合框架的使用 在Java编程中&#xff0c;数组和集合框架&#xff08;Collections Framework&#xff09;都是用于存储数据的重要工具。然而&#xff0c;它们各自有其特点和适用场景。对于初学者来说&#xff0c;理解它们之间的区别和如何正确使用它们…

【C++】手搓读写ini文件源码

【C】手搓读写ini文件源码 思路需求&#xff1a;ini.hini.cppconfig.confmian.cpp 思路 ini文件是一种系统配置文件&#xff0c;它有特定的格式组成。通常做法&#xff0c;我们读取ini文件并按照ini格式进行解析即可。在c语言中&#xff0c;提供了模板类的功能&#xff0c;所以…

C++组合类

类的数据成员不但可以是基本类型&#xff0c;也可以是其它类的对象。 组合类就是指一个类包含其他类的对象作为该类的数据成员。 当组合类创建对象时&#xff0c;其中包含的各个数据成员对象应首先被创建。因此&#xff0c;在创建类的对象时&#xff0c;既要对本类的基本…

NumPy库与PyTorch库的异同点

目录 1.单位的创建和操作 1.创建 2.形状变换 2.数学和统计操作 1.矩阵乘法 2.广播 3.统计计算 3.GPU支持 4.在深度学习中的作用 5.应用范围 NumPy库为数组服务&#xff0c;PyTorch库为张量服务&#xff0c;这是最本质的区别。 1.单位的创建和操作 1.创建 NumPy:使…

三位球形模型应用

计算机图形学&#xff1a;三维球体模型可以用于建立真实感的三维场景&#xff0c;如游戏场景、建筑模型等。 工业设计&#xff1a;三维球体模型可以用于工业设计中的产品造型设计、表面细节设计等。 地球科学&#xff1a;三维球体模型可以用于地球科学领域中的地球内部结构建…