旋轉陣列查詢
阿新 • • 發佈:2019-01-06
程式設計師面試金典裡的解法才是正解,邏輯上沒有漏洞,其他書籍的解法是有問題的:
無論陣列是否有相同數字。都可以使用下面解法:
def search(arr, left, right, x): if left > right: return -1 mid = (left+right)/2 if x == mid: return mid # 你先看下最外圍的三個if, 邏輯完備,>, <, = 都考慮到了!!! if arr[left] < arr[mid]: # 再看裡面的if,都是在確定究竟哪一段有序 if x>= arr[left] and x<arr[mid]: return search(arr, left, mid-1, x) else: return search(arr, mid+1, right, x) elif arr[mid] < arr[left]: if x>arr[mid] and x<=arr[right]: return search(arr, mid+1, right, x) else: return search(arr, left, mid-1, x) else: if arr[mid] == arr[right]: # 說明arr[mid]==arr[left]==arr[right],兩邊都有相等資料,只能兩邊繼續二分 result = search(arr, left, mid-1, x) if result == -1: return search(arr, mid+1, right, x) else: return result else: # 說明 arr[mid]!=arr[right],僅left這邊遇到相等 return search(arr, mid+1, right, x)
這段程式碼非常關鍵:
else: if arr[mid] == arr[right]: # 說明arr[mid]==arr[left]==arr[right],兩邊都有相等資料,只能兩邊繼續二分 result = search(arr, left, mid-1, x) if result == -1: return search(arr, mid+1, right, x) else: return result else: # 說明 arr[mid]!=arr[right],僅left這邊遇到相等 return search(arr, mid+1, right, x)