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

İkili Arama

Rehber 2 / 6 · Yol 2 / 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
5
7
7
8
8
10

target = 8

Sıralı dizide 8'in ilk ve son indeksi. İki sınır araması.

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 First and Last Position of Element in Sorted Array

Problem (yeniden ifade)

Sıralı bir dizide target’ın başlangıç ve bitiş indekslerini bul; yoksa [-1,-1]. O(log n).

Sezgi

target ve target+1 için iki lower_bound araması.

Yaklaşımlar

Lower ve upper bound

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

Fikir. left = lower_bound(target); right = lower_bound(target+1)-1.

Yürüyüş. [5,7,7,8,8,10], 8 → [3,4].

Trade-off. Doğrusal tarama log-zaman kısıtını bozar.

Çözüm
export function searchRange(nums: number[], target: number): number[] {
  const lower = (t: number) => {
    let lo = 0, hi = nums.length;
    while (lo < hi) {
      const mid = lo + ((hi - lo) >> 1);
      if (nums[mid]! < t) lo = mid + 1; else hi = mid;
    }
    return lo;
  };
  const left = lower(target);
  if (left === nums.length || nums[left] !== target) return [-1, -1];
  return [left, lower(target + 1) - 1];
}
export function searchRange(nums: number[], target: number): number[] {
  const lower = (t: number) => {
    let lo = 0, hi = nums.length;
    while (lo < hi) {
      const mid = lo + ((hi - lo) >> 1);
      if (nums[mid]! < t) lo = mid + 1; else hi = mid;
    }
    return lo;
  };
  const left = lower(target);
  if (left === nums.length || nums[left] !== target) return [-1, -1];
  return [left, lower(target + 1) - 1];
}

Şablon bağlantısı

Binary-search şablonundan iki lower_bound (target ve target+1).

Yansıma