From 3a9bab7fd43c1d0a0c0ca10213b2303a0d5a863f Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Sun, 25 Oct 2026 21:34:16 +0800 Subject: [PATCH] =?UTF-8?q?Update=20Leetcode=20=E9=A2=98=E8=A7=A3=20-=20?= =?UTF-8?q?=E5=93=88=E5=B8=8C=E8=A1=A8.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充和为 K 的子数组。 --- notes/Leetcode 题解 - 哈希表.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/notes/Leetcode 题解 - 哈希表.md b/notes/Leetcode 题解 - 哈希表.md index 055a0fc6..f535b8a2 100644 --- a/notes/Leetcode 题解 - 哈希表.md +++ b/notes/Leetcode 题解 - 哈希表.md @@ -5,6 +5,7 @@ * [2. 判断数组是否含有重复元素](#2-判断数组是否含有重复元素) * [3. 最长和谐序列](#3-最长和谐序列) * [4. 最长连续序列](#4-最长连续序列) + * [5. 和为 K 的子数组](#5-和为-k-的子数组) @@ -133,3 +134,32 @@ private int maxCount(Map countForNum) { return max; } ``` + +## 5. 和为 K 的子数组 + +560\. Subarray Sum Equals K (Medium) + +[Leetcode](https://leetcode.com/problems/subarray-sum-equals-k/) / [力扣](https://leetcode.cn/problems/subarray-sum-equals-k/) + +```text +Input: nums = [1, 1, 1], k = 2 +Output: 2 +``` + +题目描述:统计和为 k 的连续子数组个数,数组元素可能为负数。 + +用 sum 表示从数组开头到当前位置的前缀和,以当前位置结尾、和为 k 的子数组,对应前面某个位置的前缀和为 sum - k。遍历时用哈希表记录每个前缀和出现的次数即可。数组中有负数,窗口变大时和不一定变大,因此不能用滑动窗口。 + +```java +public int subarraySum(int[] nums, int k) { + Map cnt = new HashMap<>(); + cnt.put(0, 1); + int sum = 0, ret = 0; + for (int num : nums) { + sum += num; + ret += cnt.getOrDefault(sum - k, 0); + cnt.merge(sum, 1, Integer::sum); + } + return ret; +} +```