Subarray Sum Equals K
Problem (yeniden ifade)
Tamsayı dizisi nums (negatif olabilir) ve k verilir. Toplamı tam k olan bitişik alt dizi sayısını döndür. Aynı aralık bir kez sayılır.
Sezgi
Önek toplamları: (pref - k) kaç kez görülmüş say. Her böyle önceki önek, burada biten geçerli bir alt dizi oluşturur.
Yaklaşımlar
Önek toplam + hash map
DoğrulanmadıFikir. count[0]=1. Diziyi yürüyerek pref güncelle; ans += count[pref-k]; count[pref]++.
Yürüyüş. nums=[1,1,1], k=2 → alt diziler [1,1] iki kez → cevap 2.
Trade-off. Negatifleri işler (kayar pencere işlemez). count[0]=1 tohumlanmalı.
export function subarraySum(nums: number[], k: number): number {
const count = new Map<number, number>([[0, 1]]);
let pref = 0, ans = 0;
for (const x of nums) {
pref += x;
ans += count.get(pref - k) ?? 0;
count.set(pref, (count.get(pref) ?? 0) + 1);
}
return ans;
}
export function subarraySum(nums: number[], k: number): number {
const count = new Map<number, number>([[0, 1]]);
let pref = 0, ans = 0;
for (const x of nums) {
pref += x;
ans += count.get(pref - k) ?? 0;
count.set(pref, (count.get(pref) ?? 0) + 1);
}
return ans;
}
Şablon bağlantısı
Prefix Sum şablonundan önek toplam + hashmap.
Yansıma
count[pref - k]: kaç önek bu farkı verdi?count[0] = 1boş önek tohumu neden şart?- Negatifler kayan pencereyi bozar; hash neden bozmaz?
- k = 0 ve tüm sıfırlar: kaç alt dizi?