From 5428331826aabf032748a0c40150f25ce8f88d5c Mon Sep 17 00:00:00 2001 From: mt2324 <63892273+mt2324@users.noreply.github.com> Date: Fri, 11 Sep 2026 15:41:29 +0900 Subject: [PATCH] Create 560. Subarray Sum Equals K.md https://leetcode.com/problems/subarray-sum-equals-k/description/ --- .../560. Subarray Sum Equals K.md | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 560. Subarray Sum Equals K/560. Subarray Sum Equals K.md diff --git a/560. Subarray Sum Equals K/560. Subarray Sum Equals K.md b/560. Subarray Sum Equals K/560. Subarray Sum Equals K.md new file mode 100644 index 0000000..92118a5 --- /dev/null +++ b/560. Subarray Sum Equals K/560. Subarray Sum Equals K.md @@ -0,0 +1,56 @@ +## STEP 1 +```python +class Solution: + def subarraySum(self, nums: List[int], k: int) -> int: + count = 0 + cumulative_sums = {0:1} + cumulative_sum = 0 + for num in nums: + cumulative_sum += num + count += cumulative_sums.get(cumulative_sum - k, 0) + cumulative_sums[cumulative_sum] = cumulative_sums.get(cumulative_sum, 0) + 1 + return count +``` + +これだとタイムアウトした。 +普通のdictだとgetが重いらしい。defaultdictを使うと良さそう。 + +## STEP 2 +累積和はcumulative sumでもいいんだけどスペルに気を取られるのでprefix sumの方が楽。 +```python +from collections import defaultdict + +class Solution: + def subarraySum(self, nums: List[int], k: int) -> int: + sum_k_count = 0 + prefix_sum = 0 + prefix_sum_to_count = defaultdict(int) + prefix_sum_to_count[0] = 1 + for num in nums: + prefix_sum += num + sum_k_count += prefix_sum_to_count[prefix_sum - k] + prefix_sum_to_count[prefix_sum] += 1 + return sum_k_count +``` +実行時間の見積もりをやったことがなかったのでやってみるPythonだと安全寄りに見積って100 万ステップ/秒で。この場合最大データ20000なのでO(n)だと0.02秒、O(n^2)だと400秒なので厳しい。lognだとどうなるんだろうと思ったが2^10 が大体1000であることを考えると2^20 は大体1000,000,2^30 は1000,000,000になることがわかってれば大体計算できそう。 +[Yuto729/leetcode#16](https://github.com/Yuto729/leetcode/pull/16) + +全部正の値だとsliding window使えて、必要な空間計算量が下がるんですが今回は無理ですねというのが類似の問題との比較。 + +## STEP 3 +練習。 +```python +from collections import defaultdict + +class Solution: + def subarraySum(self, nums: List[int], k: int) -> int: + prefix_sum = 0 + prefix_sums_count = defaultdict(int) + count = 0 + prefix_sums_count[0] = 1 + for num in nums: + prefix_sum += num + count += prefix_sums_count[prefix_sum - k] + prefix_sums_count[prefix_sum] += 1 + return count +```