From 84da36acb1c4cbbc8a6c7df203c66e1a3566998c Mon Sep 17 00:00:00 2001 From: Hiro Funatsuka Date: Sun, 17 May 2026 15:49:24 +0900 Subject: [PATCH 1/2] Solve subarray sum equals k --- 560_subarray_sum_equals_k/problem.md | 1 + 560_subarray_sum_equals_k/step1.md | 51 ++++++++++++++++++++++++++++ 560_subarray_sum_equals_k/step2.md | 22 ++++++++++++ 560_subarray_sum_equals_k/step3.md | 24 +++++++++++++ 4 files changed, 98 insertions(+) create mode 100644 560_subarray_sum_equals_k/problem.md create mode 100644 560_subarray_sum_equals_k/step1.md create mode 100644 560_subarray_sum_equals_k/step2.md create mode 100644 560_subarray_sum_equals_k/step3.md diff --git a/560_subarray_sum_equals_k/problem.md b/560_subarray_sum_equals_k/problem.md new file mode 100644 index 0000000..decbd39 --- /dev/null +++ b/560_subarray_sum_equals_k/problem.md @@ -0,0 +1 @@ +## 問題: [560. Subarray Sum Equals K](https://leetcode.com/problems/subarray-sum-equals-k/description/) diff --git a/560_subarray_sum_equals_k/step1.md b/560_subarray_sum_equals_k/step1.md new file mode 100644 index 0000000..6d6db8e --- /dev/null +++ b/560_subarray_sum_equals_k/step1.md @@ -0,0 +1,51 @@ +# Step 1 + +## Approach 1 + +- 二重ループで解く + +```python +class Solution: + def subarraySum(self, nums: List[int], k: int) -> int: + num_subarrays = 0 + for i in range(len(nums)): + current_sum = 0 + for j in range(i, len(nums)): + current_sum += nums[j] + if current_sum == k: + num_subarrays += 1 + return num_subarrays +``` + +時間計算量: $O(n^2)$ + +空間計算量: $O(1)$ + +- しかし上記ではTime Limit Exceededになった。 + +## Approach 2 + +- ある地点iまでの合計から、iより前の地点jまでの合計を引いてkの個数をカウントする +- 過去の合計とそれが出た回数を記録しておく +- kからある地点での合計を引いた値が記録にあったら記録の回数を戻り値に足していく + +```python +class Solution: + def subarraySum(self, nums: List[int], k: int) -> int: + prefix_sum_to_count = {0: 1} + prefix_sum = 0 + num_subarrays = 0 + + for num in nums: + prefix_sum += num + if prefix_sum - k in prefix_sum_to_count: + num_subarrays += prefix_sum_to_count[prefix_sum - k] + prefix_sum_to_count[prefix_sum] = prefix_sum_to_count.get(prefix_sum, 0) + 1 + + return num_subarrays + +``` + +時間計算量: $O(n)$ + +空間計算量: $O(n)$ diff --git a/560_subarray_sum_equals_k/step2.md b/560_subarray_sum_equals_k/step2.md new file mode 100644 index 0000000..094088e --- /dev/null +++ b/560_subarray_sum_equals_k/step2.md @@ -0,0 +1,22 @@ +# Step 2 + +```python +class Solution: + def subarraySum(self, nums: List[int], k: int) -> int: + prefix_sum_to_count = {0: 1} + prefix_sum = 0 + num_subarrays = 0 + + for num in nums: + prefix_sum += num + if prefix_sum - k in prefix_sum_to_count: + num_subarrays += prefix_sum_to_count[prefix_sum - k] + prefix_sum_to_count[prefix_sum] = prefix_sum_to_count.get(prefix_sum, 0) + 1 + + return num_subarrays + +``` + +時間計算量: $O(n)$ + +空間計算量: $O(n)$ diff --git a/560_subarray_sum_equals_k/step3.md b/560_subarray_sum_equals_k/step3.md new file mode 100644 index 0000000..d2c7b0e --- /dev/null +++ b/560_subarray_sum_equals_k/step3.md @@ -0,0 +1,24 @@ +# Step 3 + +```python +class Solution: + def subarraySum(self, nums: List[int], k: int) -> int: + prefix_sum_to_count = {0: 1} + prefix_sum = 0 + num_subarrays = 0 + + for num in nums: + prefix_sum += num + if prefix_sum - k in prefix_sum_to_count: + num_subarrays += prefix_sum_to_count[prefix_sum - k] + prefix_sum_to_count[prefix_sum] = prefix_sum_to_count.get(prefix_sum, 0) + 1 + + return num_subarrays + +``` + +1回目: 2分 5秒 + +2回目: 1分 44秒 + +3回目: 1分 31秒 From dbb0ba935bd0d9e74a8e1425b8e2b38d00cf8770 Mon Sep 17 00:00:00 2001 From: Hiro Funatsuka Date: Sun, 17 May 2026 15:59:24 +0900 Subject: [PATCH 2/2] Refactor the code --- 560_subarray_sum_equals_k/step2.md | 3 +-- 560_subarray_sum_equals_k/step3.md | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/560_subarray_sum_equals_k/step2.md b/560_subarray_sum_equals_k/step2.md index 094088e..a79261b 100644 --- a/560_subarray_sum_equals_k/step2.md +++ b/560_subarray_sum_equals_k/step2.md @@ -9,8 +9,7 @@ class Solution: for num in nums: prefix_sum += num - if prefix_sum - k in prefix_sum_to_count: - num_subarrays += prefix_sum_to_count[prefix_sum - k] + num_subarrays += prefix_sum_to_count.get(prefix_sum - k, 0) prefix_sum_to_count[prefix_sum] = prefix_sum_to_count.get(prefix_sum, 0) + 1 return num_subarrays diff --git a/560_subarray_sum_equals_k/step3.md b/560_subarray_sum_equals_k/step3.md index d2c7b0e..4a03334 100644 --- a/560_subarray_sum_equals_k/step3.md +++ b/560_subarray_sum_equals_k/step3.md @@ -9,8 +9,7 @@ class Solution: for num in nums: prefix_sum += num - if prefix_sum - k in prefix_sum_to_count: - num_subarrays += prefix_sum_to_count[prefix_sum - k] + num_subarrays += prefix_sum_to_count.get(prefix_sum - k, 0) prefix_sum_to_count[prefix_sum] = prefix_sum_to_count.get(prefix_sum, 0) + 1 return num_subarrays