Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions 560_subarray_sum_equals_k/problem.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
## 問題: [560. Subarray Sum Equals K](https://leetcode.com/problems/subarray-sum-equals-k/description/)
51 changes: 51 additions & 0 deletions 560_subarray_sum_equals_k/step1.md
Original file line number Diff line number Diff line change
@@ -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になった。
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こちらのコメントをご参照ください。
Yuto729/leetcode#16


## 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
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

細かいですが、

        prefix_sum = 0
        prefix_sum_to_count = {0: 1}

の順番のほうが読みやすいです。

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)$
21 changes: 21 additions & 0 deletions 560_subarray_sum_equals_k/step2.md
Original file line number Diff line number Diff line change
@@ -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)$
23 changes: 23 additions & 0 deletions 560_subarray_sum_equals_k/step3.md
Original file line number Diff line number Diff line change
@@ -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秒