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..a79261b --- /dev/null +++ b/560_subarray_sum_equals_k/step2.md @@ -0,0 +1,21 @@ +# 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 + 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 + +``` + +時間計算量: $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..4a03334 --- /dev/null +++ b/560_subarray_sum_equals_k/step3.md @@ -0,0 +1,23 @@ +# 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 + 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 + +``` + +1回目: 2分 5秒 + +2回目: 1分 44秒 + +3回目: 1分 31秒