news 2026/6/10 10:57:58

子串-----和为 K 的子数组

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
子串-----和为 K 的子数组

🔥个人主页:Milestone-里程碑

❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>

<<Git>><<MySQL>>

🌟心向往之行必能至

题目解读

给定一个整数数组nums和一个整数k,我们需要统计并返回数组中和为 k 的连续子数组的个数

  • 子数组必须是连续且非空的,比如[1,1][1,1,1]的一个子数组,但[1,2]不是。
  • 注意数组中可能包含负数,这会让滑动窗口等方法失效,而前缀和则能很好地应对这种情况。

暴力解法(超时预警)

最直观的思路是枚举所有可能的子数组,计算它们的和并判断是否等于k

cpp

// 暴力解法(超时) int subarraySum(vector<int>& nums, int k) { int count = 0; for (int i = 0; i < nums.size(); ++i) { int sum = 0; for (int j = i; j < nums.size(); ++j) { sum += nums[j]; if (sum == k) count++; } } return count; }

这个方法的时间复杂度是O(n²),在nums长度达到 2×10⁴ 时会直接超时,必须寻找更优解。


最优思路:前缀和 + 哈希表

我们可以用「前缀和」来优化这个问题。

前缀和定义

我们定义preSum[i]为数组前i个元素的和,那么:preSum[i] = nums[0] + nums[1] + ... + nums[i-1]

对于子数组nums[j...i-1],它的和可以表示为:sum = preSum[i] - preSum[j]

我们的目标是找到所有满足preSum[i] - preSum[j] = kj,也就是:preSum[j] = preSum[i] - k

哈希表优化

我们可以用一个哈希表hash来记录每个前缀和出现的次数,这样在遍历到i时,只需要查询hash[preSum[i] - k]就能得到满足条件的j的数量,从而把时间复杂度降到 O (n)。

初始化技巧

  • 我们需要把hash[0] = 1作为初始值,这是为了处理preSum[i] = k的情况(此时j = 0,对应子数组从开头到i-1)。

完整代码实现

cpp

class Solution { public: int subarraySum(vector<int>& nums, int k) { unordered_map<int, int> hash; hash[0] = 1; // 初始化前缀和 0 出现 1 次 int preSum = 0; int count = 0; for (int num : nums) { preSum += num; // 查找有多少个前缀和等于 preSum - k if (hash.find(preSum - k) != hash.end()) { count += hash[preSum - k]; } // 将当前前缀和加入哈希表 hash[preSum]++; } return count; } };

代码解析

  1. 初始化哈希表hash[0] = 1是为了处理子数组从第一个元素开始的情况。
  2. 遍历计算前缀和:每次遍历num时,更新当前的前缀和preSum
  3. 查询哈希表:如果preSum - k存在于哈希表中,说明存在j使得preSum[i] - preSum[j] = k,此时把对应的次数加到count中。
  4. 更新哈希表:将当前前缀和preSum加入哈希表,记录它出现的次数。

复杂度分析

  • 时间复杂度:O (n),我们只需要遍历数组一次,哈希表的查询和插入操作都是 O (1)。
  • 空间复杂度:O (n),哈希表最多存储 n 个不同的前缀和。

总结

这道题的核心是利用「前缀和」将子数组和的问题转化为前缀和的差值问题,再通过「哈希表」快速统计符合条件的前缀和出现次数,从而实现线性时间复杂度的解法。这种思路在很多子数组和相关的题目中都非常有用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:22:49

【花雕学编程】Arduino BLDC 之动态分配探索区域避免重复路径机器人

“Arduino BLDC之动态分配探索区域避免重复路径机器人”是一个典型的多智能体协同与自主探索系统。它超越了单机SLAM的范畴&#xff0c;旨在通过多台由Arduino控制的BLDC移动机器人协同工作&#xff0c;利用分布式算法动态划分未知环境的探索区域&#xff0c;从而在最短时间内完…

作者头像 李华
网站建设 2026/6/10 15:04:24

意识的三层结构

意识的三层结构 意识的三层结构是弗洛伊德精神分析理论的核心框架之一&#xff0c;也是心理分析批评中挖掘文本深层内涵、解读人物行为隐秘动因的底层工具。弗洛伊德将人类的心理活动按感知与可触达性划分为意识、前意识、无意识&#xff08;潜意识&#xff09; 三个层次&…

作者头像 李华
网站建设 2026/6/10 11:37:42

【小程序毕设源码分享】基于springboot+小程序的居家养老服务的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/10 16:04:41

写了三年 JavaScript,我才真正看懂 if 语句

有一天早上,我去楼下买早餐。老板抬头看了我一眼,问了一句:“要不要加鸡蛋?” 我点点头。老板立刻做了一个判断: 如果我说“要”,那就多加一个鸡蛋; 如果我说“不要”,那就直接装袋。 你发现没有?这个看似平平无奇的行为,本质上就是一个 if 语句。现实世界里,几乎所…

作者头像 李华
网站建设 2026/6/10 13:41:20

她是86版《西游记》花费最高的女演员,出镜仅3分钟,美过嫦娥

在影视的璀璨星河中&#xff0c;86 版《西游记》宛如一颗永恒的恒星&#xff0c;散发着无尽的魅力。剧中众多角色皆令人印象深刻&#xff0c;而有一位女演员&#xff0c;虽出镜仅短短 3 分钟&#xff0c;却堪称该剧花费最高的女演员&#xff0c;其美貌更是赛过嫦娥&#xff0c;…

作者头像 李华
网站建设 2026/6/10 13:43:07

亚马逊云科技获评弗若斯特沙利文《2025年在华外商企业云计算采用研究报告》领导者,四大优势赋能企业在华数智化转型升级

近期&#xff0c;弗若斯特沙利文&#xff08;Frost & Sullivan&#xff09;联合头豹研究院发布了《2025年在华外商企业云计算服务采用研究报告》&#xff0c;亚马逊云科技凭借其全球标准一致的技术、领先的安全合规能力和深厚的本地化运营经验等综合实力&#xff0c;在核心…

作者头像 李华