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

Cevap Üzerinde İkili Arama

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
1
10
3
10
2

m=3, k=1

Açma günleri [1,10,3,10,2]. k=1 komşu çiçekten m=3 buket gerekir.

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

Minimum Number of Days to Make m Bouquets

Problem (yeniden ifade)

bloomDay[i], i. çiçeğin açtığı gündür. Bir buket, bitişik k açmış çiçek ister. m buketi mümkün kılan en küçük günü döndür; imkânsızsa -1.

Sezgi

Gün d işe yarıyorsa sonraki günler de yarar. d üzerinde binary search; gün d’de greedy buket say.

Yaklaşımlar

Gün üzerinde binary search

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

Fikir. lo=min(days), hi=max(days). canMake(d): ≤ d’de açmış k’lık bitişik grupları tara.

Yürüyüş. [1,10,3,10,2], m=3, k=1 → 3; m=3,k=2 → -1.

Trade-off. ship/Koko ile aynı uygulanabilirlik kalıbı.

Çözüm
export function minDays(bloomDay: number[], m: number, k: number): number {
  if (BigInt(m) * BigInt(k) > BigInt(bloomDay.length)) return -1;
  let lo = Math.min(...bloomDay), hi = Math.max(...bloomDay);
  const ok = (day: number) => {
    let bouquets = 0, adj = 0;
    for (const d of bloomDay) {
      if (d <= day) { adj++; if (adj === k) { bouquets++; adj = 0; } }
      else adj = 0;
    }
    return bouquets >= m;
  };
  while (lo < hi) {
    const mid = lo + ((hi - lo) >> 1);
    if (ok(mid)) hi = mid; else lo = mid + 1;
  }
  return lo;
}
export function minDays(bloomDay: number[], m: number, k: number): number {
  if (BigInt(m) * BigInt(k) > BigInt(bloomDay.length)) return -1;
  let lo = Math.min(...bloomDay), hi = Math.max(...bloomDay);
  const ok = (day: number) => {
    let bouquets = 0, adj = 0;
    for (const d of bloomDay) {
      if (d <= day) { adj++; if (adj === k) { bouquets++; adj = 0; } }
      else adj = 0;
    }
    return bouquets >= m;
  };
  while (lo < hi) {
    const mid = lo + ((hi - lo) >> 1);
    if (ok(mid)) hi = mid; else lo = mid + 1;
  }
  return lo;
}

Şablon bağlantısı

Çiçek açma gününe binary search; greedy k’lık bitişik gruplar fizibilite kontrolü.

Yansıma