【LeetCode 前缀和 + 哈希表】LC_560_和为K的子数组

文章目录

      • [1. 和为K的子数组🆗](#1. 和为K的子数组🆗)

1. 和为K的子数组🆗

题目链接🔗


  • 🐧解题思路前缀和 + 哈希表

🍎 设i为数组中的任意位置,⽤ sum[i] 表⽰ [0, i] 区间内所有元素的和。

🍎 想知道有多少个「以 i 为结尾的和为 k 的⼦数组」,就要找到有多少个起始位置为 x1, x2, x3... 使得 [x, i] 区间内的所有元素的和为 k 。那么[0, x]区间内的和是不是就是sum[i] - k 了。

于是问题就变成:

找到在[0, i - 1]区间内,有多少前缀和等于sum[i] - k的即可。

我们不⽤真的初始化⼀个前缀和数组,因为我们只关⼼在i位置之前,有多少个前缀和等于
sum[i] - k 。因此,我们仅需⽤⼀个哈希表,⼀边求当前位置的前缀和,⼀边存下之前每⼀种

前缀和出现的次数。


cpp 复制代码
class Solution
{
public:
 int subarraySum(vector<int>& nums, int k) 
 {
	 unordered_map<int, int> hash; // 统计前缀和出现的次数
	 
	 // 为什么初始值 hash[0] = 1呢?
	 // 因为:有可能 sum == k, 我们统计 hash.count(sum - k)统计的是当前元素之前的值,没有统计千
	 // 前缀和刚好等于 k 的情况
	 hash[0] = 1;
	 
	 int sum = 0, ret = 0;
	 for(auto x : nums)
	 {
		 sum += x; // 计算当前位置的前缀和
		 if(hash.count(sum - k)) ret += hash[sum - k]; // 统计个数
		 hash[sum]++;
	 }
	 return ret;
 }
};
相关推荐
_日拱一卒10 小时前
LeetCode:207课程表
java·数据结构·算法·leetcode·职场和发展
风筝在晴天搁浅13 小时前
美团 LeetCode 692.前K个高频单词
算法·leetcode·职场和发展
z2005093014 小时前
今日算法(回溯子集)(模版题)
数据结构·算法·leetcode
YL2004042615 小时前
071字符串解码
数据结构·leetcode
z2005093017 小时前
今日算法(回溯子集)
数据结构·算法·leetcode
Hesionberger17 小时前
巧用异或找出唯一数字(多解)
java·数据结构·python·算法·leetcode
菜菜的顾清寒18 小时前
力扣HOT100(47) 二叉树的层序遍历
算法·leetcode·深度优先
sheeta199819 小时前
LeetCode 每日一题笔记 日期:2026.05.31 题目:2126. 摧毁小行星
笔记·算法·leetcode
INGNIGHT19 小时前
984.不含 AAA 或 BBB 的字符串(贪心)
开发语言·算法·leetcode
人道领域20 小时前
【LeetCode刷题日记】538.把二叉搜索树转换为累加树
java·开发语言·后端·算法·leetcode