medium LC #560 ↗

PROBLEM 06

合計が目標になる連続区間

合計が target になる連続部分配列の個数を数えます。

目安 30分 prefix-sum · frequency-map

日ごとの増減値が配列で与えられます。 連続する1日以上の区間のうち、合計が target と等しくなる区間はいくつあるでしょうか。

subarraySum(nums, target) は区間の個数を返してください。 同じ位置を含む区間同士が重なっていても、それぞれ数えます。

入力: nums = [1, 2, 1, 2], target = 3
出力: 3
理由: [1,2]、[2,1]、[1,2] の3区間
入力: nums = [0, 0, 0], target = 0
出力: 6

制約

  • 1 <= nums.length <= 100,000
  • 各要素と target は安全な整数
  • 配列には負数と0を含む

対応する問題: LeetCode #560 Subarray Sum Equals K

STEPWISE HINTS

ヒント

01考え方の方向

各位置までの累積和を考えます。2つの累積和の差が target なら、その間の区間が答えです。

02使うデータ構造

現在の累積和を prefix とすると、過去に prefix - target が何回あったかが、今の位置で終わる区間数です。

03擬似コード

freq = Map([[0,1]]) から始める。prefix を更新し、freq.get(prefix-target) を答えに足してから、freq[prefix] を増やす。

AFTER ACCEPTED

解説

AC 後に解説が開きます

まずは自分の言葉で方針を説明し、コードに落としてみましょう。