Skip to content

Commit d93b72c

Browse files
committed
三刷560
1 parent c2f1cc4 commit d93b72c

File tree

5 files changed

+81
-13
lines changed

5 files changed

+81
-13
lines changed

docs/0560-subarray-sum-equals-k.adoc

+43-13
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,34 @@
11
[#0560-subarray-sum-equals-k]
2-
= 560. Subarray Sum Equals K
2+
= 560. 和为 K 的子数组
33

4-
{leetcode}/problems/subarray-sum-equals-k/[LeetCode - Subarray Sum Equals K^]
4+
https://leetcode.cn/problems/subarray-sum-equals-k/[LeetCode - 560. 和为 K 的子数组 ^]
55

6-
Given an array of integers and an integer **k**, you need to find the total number of continuous subarrays whose sum equals to **k**.
6+
给你一个整数数组 `nums` 和一个整数 `k` ,请你统计并返回 _该数组中和为 `k` 的子数组的个数_
77

8-
*Example 1:*
8+
子数组是数组中元素的连续非空序列。
99

10-
[subs="verbatim,quotes,macros"]
11-
----
12-
*Input:* nums = [1,1,1], k = 2
13-
*Output:* 2
14-
----
10+
*示例 1:*
11+
12+
....
13+
输入:nums = [1,1,1], k = 2
14+
输出:2
15+
....
16+
17+
*示例 2:*
18+
19+
....
20+
输入:nums = [1,2,3], k = 3
21+
输出:2
22+
....
1523

16-
*Note:*
24+
*提示:*
1725

18-
. The length of the array is in range [1, 20,000].
19-
. The range of numbers in the array is [-1000, 1000] and the range of the integer *k* is [-1e7, 1e7].
26+
* `1 \<= nums.length \<= 2 * 10^4^`
27+
* `+-1000 <= nums[i] <= 1000+`
28+
* `-10^7^ \<= k \<= 10^7^`
2029
21-
== 解题分析
30+
31+
== 思路分析
2232

2333
背后的想法如下:如果累积总和(由 `sum[i]` 表示加到 `i^th^` 的和)最多两个指数是相同的,那么这些元素之间的元素总和为零。进一步扩展相同的想法,如果累计总和,在索引 `i` 和 `j` 处相差 `k`,即 `sum[i]−sum[j]=k`,则位于索引 `i` 和 `j` 之间的元素之和是 `k`。
2434

@@ -47,15 +57,35 @@ image::images/0560-08.png[{image_attr}]
4757
image::images/0560-09.png[{image_attr}]
4858

4959
[[src-0560]]
60+
[tabs]
61+
====
62+
一刷::
63+
+
64+
--
5065
[{java_src_attr}]
5166
----
5267
include::{sourcedir}/_0560_SubarraySumEqualsK.java[tag=answer]
5368
----
69+
--
5470
71+
二刷::
72+
+
73+
--
5574
[{java_src_attr}]
5675
----
5776
include::{sourcedir}/_0560_SubarraySumEqualsK_2.java[tag=answer]
5877
----
78+
--
79+
80+
三刷::
81+
+
82+
--
83+
[{java_src_attr}]
84+
----
85+
include::{sourcedir}/_0560_SubarraySumEqualsK_3.java[tag=answer]
86+
----
87+
--
88+
====
5989

6090

6191
== 参考资料

logbook/202503.adoc

+5
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,11 @@ endif::[]
508508
|{doc_base_url}/0049-group-anagrams.adoc[题解]
509509
|✅ 使用 `Map` 存字符和数量即可。
510510

511+
|{counter:codes}
512+
|{leetcode_base_url}/subarray-sum-equals-k/[560. 和为 K 的子数组^]
513+
|{doc_base_url}/0560-subarray-sum-equals-k.adoc[题解]
514+
|✅ 前缀和。需要记录每一个和的出现次数。
515+
511516
|===
512517

513518
截止目前,本轮练习一共完成 {codes2503} 道题。

src/main/java/com/diguage/algo/leetcode/_0560_SubarraySumEqualsK.java

+3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ public class _0560_SubarraySumEqualsK {
1919
* Memory Usage: 42.2 MB, less than 5.43% of Java online submissions for Subarray Sum Equals K.
2020
*
2121
* Copy from: https://leetcode-cn.com/problems/subarray-sum-equals-k/solution/he-wei-kde-zi-shu-zu-by-leetcode/[和为K的子数组 - 和为K的子数组 - 力扣(LeetCode)]
22+
*
23+
* @author D瓜哥 · https://www.diguage.com
24+
* @since 2020-01-30 23:14
2225
*/
2326
public int subarraySum(int[] nums, int k) {
2427
if (Objects.isNull(nums) || nums.length == 0) {

src/main/java/com/diguage/algo/leetcode/_0560_SubarraySumEqualsK_2.java

+3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ public class _0560_SubarraySumEqualsK_2 {
1414
// tag::answer[]
1515
/**
1616
* 自己根据“前缀和”套路想的思路,参考 https://leetcode.cn/problems/subarray-sum-equals-k/solutions/238572/he-wei-kde-zi-shu-zu-by-leetcode-solution/[560. 和为 K 的子数组 - 官方题解^] 更正了代码。
17+
*
18+
* @author D瓜哥 · https://www.diguage.com
19+
* @since 2024-06-23 11:08:29
1720
*/
1821
public int subarraySum(int[] nums, int k) {
1922
int result = 0;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.diguage.algo.leetcode;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
public class _0560_SubarraySumEqualsK_3 {
7+
// tag::answer[]
8+
9+
/**
10+
* @author D瓜哥 · https://www.diguage.com
11+
* @since 2025-04-26 23:25:38
12+
*/
13+
public int subarraySum(int[] nums, int k) {
14+
Map<Integer, Integer> sumToCounterMap = new HashMap<>();
15+
// 在数组求前缀和之前,0 个元素的和是 0,也就是存在 1 个和是 0 的情况。
16+
sumToCounterMap.put(0, 1);
17+
int sum = 0;
18+
int result = 0;
19+
for (int i = 0; i < nums.length; i++) {
20+
sum += nums[i];
21+
sumToCounterMap.put(sum, sumToCounterMap.getOrDefault(sum, 0) + 1);
22+
result += sumToCounterMap.getOrDefault(sum - k, 0);
23+
}
24+
return result;
25+
}
26+
// end::answer[]
27+
}

0 commit comments

Comments
 (0)