İçeriğe atla
ΣDSA Patterns
Menü
Dil

Önek Toplam

Rehber 6 / 6 · Yol 6 / 6

Etkileşimli

Zihinsel model

Bu problem için animasyonlu çözüm. Adımları kaydır veya boşlukla duraklat; değişmezi yüksek sesle yeniden anlat.

Adım 1 / 6
4
5
0
-2
-3
1
eşlem0→1

k = 5

Toplamı k=5'e bölünen alt dizileri say. Aynı önek kalanı.

Demo önizleme: Bu çözümler otomatik test paketini geçiyor ama insan tarafından incelenmedi. Trade-off ve yazıları taslak olarak değerlendirin.

Subarray Sums Divisible by K

Problem (yeniden ifade)

Tamsayı dizisi nums ve k verilir. Toplamı k’ya tam bölünen, boş olmayan bitişik alt dizi sayısını döndür. nums negatif olabilir.

Sezgi

Önek toplamların aynı kalanı ⇒ aradaki toplam k’ya bölünür.

Yaklaşımlar

Önek mod sayıları

Doğrulanmadı
Zaman O(n)Alan O(k)

Fikir. Her önek mod’unun sıklığını say; her yeni mod r için count[r] ekle, sonra artır.

Yürüyüş. [4,5,0,-2,-3,1], k=5 → 7.

Trade-off. Negatif kalan veren dillerde negatif mod’ları normalize et.

Çözüm
export function subarraysDivByK(nums: number[], k: number): number {
  const cnt = new Array<number>(k).fill(0);
  cnt[0] = 1;
  let sum = 0, ans = 0;
  for (const x of nums) {
    sum += x;
    const r = ((sum % k) + k) % k;
    ans += cnt[r]!;
    cnt[r]!++;
  }
  return ans;
}
export function subarraysDivByK(nums: number[], k: number): number {
  const cnt = new Array<number>(k).fill(0);
  cnt[0] = 1;
  let sum = 0, ans = 0;
  for (const x of nums) {
    sum += x;
    const r = ((sum % k) + k) % k;
    ans += cnt[r]!;
    cnt[r]!++;
  }
  return ans;
}

Şablon bağlantısı

prefix mod k; kalan frekanslarını say (523 / 930 ailesi).

Yansıma