Döndürülmüş sıralı bir dizide (Search in Rotated Sorted Array) bir hedefi O(log n) zamanda arayın.
Cevap
[4,5,6,7,0,1,2] gibi bir dizide her mid noktasında iki yarıdan biri mutlaka sıralıdır. Hangi yarının sıralı olduğunu bulup hedefin o aralıkta olup olmadığına göre aramayı daraltırız; bu, binary search'ün değiştirilmiş hâlidir.
def search(nums, target):
lo, hi = 0, len(nums) - 1
while lo <= hi:
mid = (lo + hi) // 2
if nums[mid] == target:
return mid
if nums[lo] <= nums[mid]: # sol yarı sıralı
if nums[lo] <= target < nums[mid]:
hi = mid - 1
else:
lo = mid + 1
else: # sağ yarı sıralı
if nums[mid] < target <= nums[hi]:
lo = mid + 1
else:
hi = mid - 1
return -1
print(search([4, 5, 6, 7, 0, 1, 2], 0)) # 4
print(search([4, 5, 6, 7, 0, 1, 2], 3)) # -1Kilit noktalar
nums[lo] <= nums[mid]karşılaştırmasındaki=,lo == midolduğu iki elemanlı durumlar için gereklidir.- Hedef aralık kontrolünde bir uç kapalı, diğer uç açık olmalıdır;
midzaten kontrol edildi.
Karmaşıklık
O(log n) zaman, O(1) bellek.
İlgili sorular
- Find Minimum in Rotated Sorted Array:
nums[mid] > nums[hi]ise minimum sağdadır (lo = mid + 1), değilsehi = mid. - Tekrarlayan elemanlar varsa:
nums[lo] == nums[mid] == nums[hi]durumunda hangi yarının sıralı olduğu anlaşılamaz;lo += 1, hi -= 1yapılır ve en kötü durumO(n)olur.
İlgili Algoritmalar & Veri Yapıları soruları
- Binary search'ün zaman karmaşıklığı nedir ve neden?
- Two Sum: toplamı hedefe eşit olan iki elemanın indekslerini bulun.
- Bir parantez dizisinin geçerli olup olmadığını kontrol edin: "({[]})"
- Tek yönlü bağlı listeyi ters çevirin.
- BFS ve DFS arasındaki fark nedir? Hangisini ne zaman kullanırsınız?
- get ve put işlemleri O(1) olan bir LRU Cache tasarlayın.
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.