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

Cevap Üzerinde İkili Arama

Rehber 5 / 6 · Yol 5 / 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
1
2
5
9

threshold = 6

Σ ceil(nums[i]/d) ≤ 6 olacak en küçük bölen d.

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

Find the Smallest Divisor Given a Threshold

Problem (yeniden ifade)

Pozitif tamsayı dizisi nums ve bir threshold verilir. Her nums[i]’yi pozitif d ile ceil bölüp topla; bu toplam threshold’u aşmayacak en küçük d’yi döndür.

Sezgi

Daha büyük divisor → daha küçük toplam; divisor üzerinde binary search.

Yaklaşımlar

Divisor üzerinde binary search

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

Fikir. lo=1, hi=max(nums). mid tamam eğer sum(ceil(x/mid)) ≤ threshold.

Yürüyüş. [1,2,5,9], threshold=6 → divisor 5.

Trade-off. Koko / gemi kapasitesi ile aynı kalıp.

Çözüm
export function smallestDivisor(nums: number[], threshold: number): number {
  let lo = 1, hi = Math.max(...nums);
  const ok = (d: number) => {
    let s = 0;
    for (const x of nums) s += Math.ceil(x / d);
    return s <= threshold;
  };
  while (lo < hi) {
    const mid = lo + ((hi - lo) >> 1);
    if (ok(mid)) hi = mid; else lo = mid + 1;
  }
  return lo;
}
export function smallestDivisor(nums: number[], threshold: number): number {
  let lo = 1, hi = Math.max(...nums);
  const ok = (d: number) => {
    let s = 0;
    for (const x of nums) s += Math.ceil(x / d);
    return s <= threshold;
  };
  while (lo < hi) {
    const mid = lo + ((hi - lo) >> 1);
    if (ok(mid)) hi = mid; else lo = mid + 1;
  }
  return lo;
}

Şablon bağlantısı

Bölen üzerine binary search; tavan toplamı fizibilite kontrolü.

Yansıma