【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;
 }
};
相关推荐
圣保罗的大教堂2 小时前
leetcode 1406. 石子游戏 III 困难
leetcode
带多刺的玫瑰10 小时前
Leecode#15刷题之三数之和
算法·leetcode·职场和发展
圣保罗的大教堂10 小时前
leetcode 877. 石子游戏 中等
leetcode
shehuiyuelaiyuehao12 小时前
算法32,连续数组,前缀和+哈希表
算法·leetcode·职场和发展
Navigator_Z14 小时前
LeetCode //C - 1223. Dice Roll Simulation
c语言·算法·leetcode
Tisfy15 小时前
LeetCode 2058.找出临界点之间的最小和最大距离:遍历+遇到极值则更新(这种题谁空间复杂度不是O(1)啊)
linux·数据库·leetcode·链表·题解·模拟·遍历
小欣加油15 小时前
Leetcode2058 找出临界点之间的最小和最大距离
数据结构·c++·算法·leetcode·职场和发展
CoderYanger15 小时前
A.每日一题:3345. 最小可整除数位乘积 I
java·数据结构·程序人生·算法·leetcode·面试·学习方法
玖玥拾16 小时前
LeetCode 1 两数之和
算法·leetcode·职场和发展
旖旎夜光16 小时前
LeetCode 974:和可被 K 整除的子数组(前缀和) —— 题解
数据结构·c++·算法·leetcode·前缀和