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](位置0-1)、[2,1](位置1-2)、[1,2](位置2-3)の3区間。位置が違えば別の区間として数える
入力: nums = [0, 0, 0], target = 0
出力: 6
理由: 長さ1が3区間、長さ2が2区間、長さ3が1区間で合計6。値が同じでも位置が違えば別の区間

制約

  • 1 <= nums.length <= 100,000
  • 各要素と target は安全な整数
  • 配列には負数と0を含む
  • 目標: O(n) 相当(全区間を試す解法は性能テストで時間切れになります)

対応する問題: 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 後に解説が開きます

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