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

Cevap Üzerinde İkili Arama

Rehber 3 / 6 · Yol 3 / 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 / 8
1F
2F
3F
4T
5T
6T
7T
8T

feasible(x) is monotonic

Dizi indeksi değil, cevap uzayında ara. Örnek: en küçük uygulanabilir hız.

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

Koko Eating Bananas

Problem (yeniden ifade)

Koko’nun piles muz yığınları ve h saati var. Saatlik k hızında yer; bir yığını bitirmek ceil(pile/k) saat sürer ve aynı anda tek yığın yer. Tüm yığınları h saat içinde bitiren en küçük k’yı döndür.

Sezgi

Daha yüksek k her zaman daha geç bitirmez → monotonik. k’yı [1, max(pile)] içinde ikili ara.

Yaklaşımlar

Yeme hızı üzerinde ikili arama

Doğrulanmadı
Zaman O(n log M)Alan O(1)

Fikir. lo=1, hi=max(piles). feasible(k)=sum(ceil(pile/k)) ≤ h. Min k’yı bul.

Yürüyüş. piles=[3,6,7,11], h=8 → k=4.

Trade-off. Float’tan kaçınmak için tamsayı ceil dikkatli: (pile + k - 1) / k.

Çözüm
export function minEatingSpeed(piles: number[], h: number): number {
  let lo = 1, hi = Math.max(...piles);
  const feasible = (k: number) => {
    let hours = 0;
    for (const p of piles) hours += Math.ceil(p / k);
    return hours <= h;
  };
  while (lo < hi) {
    const mid = lo + ((hi - lo) >> 1);
    if (feasible(mid)) hi = mid;
    else lo = mid + 1;
  }
  return lo;
}
export function minEatingSpeed(piles: number[], h: number): number {
  let lo = 1, hi = Math.max(...piles);
  const feasible = (k: number) => {
    let hours = 0;
    for (const p of piles) hours += Math.ceil(p / k);
    return hours <= h;
  };
  while (lo < hi) {
    const mid = lo + ((hi - lo) >> 1);
    if (feasible(mid)) hi = mid;
    else lo = mid + 1;
  }
  return lo;
}

Şablon bağlantısı

Doğrusal uygulanabilirlik kontrolüyle cevap üzerinde ikili arama.

Yansıma