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
11 changes: 11 additions & 0 deletions 560/memo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# 560. Subarray Sum Equals K

- 累積和は自力で思いついてかけた(sol1.py)
- 累積和配列を作って逆順に数える。やや冗長。
- ちょっと考えると一巡で書ける(sol2.py)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

書けてから変形を考えるのも大事ですね。

- ちょっと問題を変えて、和が 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回くらいメモリー不足で更新プログラムが落ちる」みたいになってきます。

22 changes: 22 additions & 0 deletions 560/sol1.py
Original file line number Diff line number Diff line change
@@ -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
14 changes: 14 additions & 0 deletions 560/sol2.py
Original file line number Diff line number Diff line change
@@ -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