【LeetCode】560.和为K的子数组
- 开源代码
- 2025-09-03 09:03:02

目录 题目题目要求什么是子数组? 解法 前缀和 + 哈希表核心思路具体步骤 代码 题目
题目链接:LeetCode-560题
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。
题目要求 子数组是数组中元素的连续非空序列统计和为 k 的子数组的个数 什么是子数组?子数组是数组中连续的一段元素组成的序列。例如,数组 [1, 2, 3] 的子数组包括 [1]、[2]、[3]、[1, 2]、[2, 3] 和 [1, 2, 3]。
解法 前缀和 + 哈希表 核心思路如何快速统计和为 k 的子数组?
前缀和是一种常用的技巧,用于快速计算任意子数组的和。 我们需要找到所有满足 sum(nums[i…j]) = k 的子数组。根据前缀和的性质,可以转化为 dp[j] - dp[i-1] = k //前缀和-前缀和即:
dp[j] - k = dp[i-1]换句话说,我们需要找到所有满足 dp[j] - k 等于某个前缀和dp[i-1] 的情况。
哈希表的引入 为了快速查找是否存在某个前缀和,我们可以使用哈希表来记录前缀和出现的次数。 具体步骤1.初始化:
使用哈希表 记录前缀和出现的次数。初始时,hash[0] = 1,表示前缀和为 0 的情况出现了一次,这样可以使刚好等于k的数字成为一个子数组。
初始化 sum 为 0,用于记录当前的前缀和。
初始化 count 为 0,用于记录满足条件的子数组的个数。
2.遍历数组:
对于数组中的每一个元素 num,更新sum,即 sum += num。
检查 sum - k 是否在哈希表中。如果在,则说明存在若干个子数组的和为 k,将这些子数组的数量累加到 count 中。
更新哈希表,将当前前缀和 currentSum 的出现次数加一。
代码 class Solution { public: unordered_map<int,int> hash; int ret = 0; int subarraySum(vector<int>& nums, int k) { hash[0] = 1; //为了使得一个数也可以成为一个数组 //前缀和 int sum = 0; for(int i = 0;i<nums.size();i++) { sum+=nums[i]; if(hash.count(sum-k)) ret+=hash[sum-k]; hash[sum]++; } return ret; } };【LeetCode】560.和为K的子数组由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【LeetCode】560.和为K的子数组”