diff --git a/560/memo.md b/560/memo.md new file mode 100644 index 0000000..6744206 --- /dev/null +++ b/560/memo.md @@ -0,0 +1,11 @@ +# 560. Subarray Sum Equals K + +- 累積和は自力で思いついてかけた(sol1.py) + - 累積和配列を作って逆順に数える。やや冗長。 +- ちょっと考えると一巡で書ける(sol2.py) +- ちょっと問題を変えて、和が K となる区間を列挙する問題にしてみたらどうでしょうか。もうちょっと言い換えると、「鉄道があって、各駅間ごとの標高差が与えられます。標高差が ちょうど K であるようなすべての駅の組み合わせを列挙してください。」ということです。最後に len を取れば、元の問題の答えになるはずなので、ジャッジも使えるでしょう。これを累積和を使って出してください。 + - [https://discord.com/channels/1084280443945353267/1233603535862628432/1252232545056063548](https://discord.com/channels/1084280443945353267/1233603535862628432/1252232545056063548) + - 今の解法でインデックスのリストをdefault dictにすればできる +- [https://github.com/Hurukawa2121/leetcode/pull/16#discussion_r1898332261](https://github.com/Hurukawa2121/leetcode/pull/16#discussion_r1898332261) + - 現実的にはパフォーマンス不足がどういう感じになるかというと、たとえば、「一日一回深夜に30分で更新作業が走るようにしておく」などしてあるパイプラインが、だんだんデータとともに伸びていって「朝になっても更新が終わらないなあ」みたいになってきます。あるいは「3日に1回くらいメモリー不足で更新プログラムが落ちる」みたいになってきます。 + diff --git a/560/sol1.py b/560/sol1.py new file mode 100644 index 0000000..508688b --- /dev/null +++ b/560/sol1.py @@ -0,0 +1,22 @@ +from collections import defaultdict +from typing import List + + +class Solution: + def subarraySum(self, nums: List[int], k: int) -> int: + prefix_sums = [] + prefix_sum = 0 + for value in nums: + prefix_sum += value + prefix_sums.append(prefix_sum) + + answer = 0 + prefix_sums.reverse() + prefix_sums.append(0) + + needed_prefix_sum_counts = defaultdict(int) + for prefix_sum in prefix_sums: + answer += needed_prefix_sum_counts[prefix_sum] + needed_prefix_sum = prefix_sum - k + needed_prefix_sum_counts[needed_prefix_sum] += 1 + return answer diff --git a/560/sol2.py b/560/sol2.py new file mode 100644 index 0000000..239994e --- /dev/null +++ b/560/sol2.py @@ -0,0 +1,14 @@ +from collections import defaultdict + + +class Solution: + def subarraySum(self, nums: List[int], k: int) -> int: + prefix_count = defaultdict(int) + + prefix_sum = 0 + count = 0 + for n in nums: + prefix_count[prefix_sum] += 1 + prefix_sum += n + count += prefix_count[prefix_sum - k] + return count