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

Fark Dizisi

Rehber 1 / 6 · Yol 1 / 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
0
0
0
0
0

updates = 3

Uzunluk 5 sıfır dizisinde aralık ekleme. L'ye +inc, R+1'e −inc yaz.

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

Range Addition

Problem (yeniden ifade)

length uzunluğunda dizi 0’dan başlar. updates[i] = [start, end, inc] kapalı aralığa inc ekler. Son diziyi döndür.

Sezgi

start’ta +inc, end+1’de -inc; önek toplam diziyi O(n)’de somutlaştırır.

Yaklaşımlar

Difference array aralık güncellemeleri

Doğrulanmadı
Zaman O(n + u)Alan O(n)

Fikir. Klasik difference array. Güncelleme başına O(n)’den kaçın.

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

Trade-off. Segment tree yalnızca güncellemelerle karışık çevrimiçi sorgular için gerekir.

Çözüm
export function getModifiedArray(length: number, updates: number[][]): number[] {
  const diff = Array(length + 1).fill(0);
  for (const u of updates) {
    diff[u[0]!] += u[2]!;
    diff[u[1]! + 1] -= u[2]!;
  }
  const res = Array(length).fill(0);
  let cur = 0;
  for (let i = 0; i < length; i++) {
    cur += diff[i]!;
    res[i] = cur;
  }
  return res;
}
export function getModifiedArray(length: number, updates: number[][]): number[] {
  const diff = Array(length + 1).fill(0);
  for (const u of updates) {
    diff[u[0]!] += u[2]!;
    diff[u[1]! + 1] -= u[2]!;
  }
  const res = Array(length).fill(0);
  let cur = 0;
  for (let i = 0; i < length; i++) {
    cur += diff[i]!;
    res[i] = cur;
  }
  return res;
}

Şablon bağlantısı

Difference array toplu aralık güncellemeleri.

Yansıma