題目
給定一個含有 n 個無重複整數的升序列表 nums 和一個目標值 target ,請查找 nums 中的 target,如果目標值存在返回下標,否則返回 -1。
例如:
給定一個列表 nums :[-1, 0, 3, 5, 9, 12],target = 9
返回結果:4給定一個列表 nums :[-1, 0, 3, 5, 9, 12],target = 2
返回結果:-1
實現思路
在本題中說明了 nums 是一個有序列表,並且列表中元素無重複,因此我們可以考慮使用 二分查找
來實現。
- 定義2個變量:left、right ,分別表示左邊界下標和右邊界下標,left 默認值爲第一個元素下標,即 left = 0,right 默認值爲最後一個元素下標,即 right = len(nums) - 1
- 首先,計算出 left 和 right 之間的中間元素下標 mid = (left + right) // 2,並將中間元素 nums[mid] 與目標值 target 進行比較,總共分爲3種情況
- 第一種情況,如果中間元素等於 target ,那麼直接返回 mid 即可
- 第二種情況,如果中間元素大於 target ,那麼說明 target 出現在中間元素的左側,所以需要修改右邊界下標 right = mid - 1
- 第三種情況,如果中間元素小於 target ,那麼說明 target 出現在中間元素的右側,所以需要修改左邊界下標 left = mid + 1
- 當 left 小於等於 right ,我們就對以上幾步進行重複操作,如果在列表中查找到 target ,那麼就可以直接返回對應下標,如果最後 left 大於 right 時還沒有查找到 target ,那麼就說明列表中不存在 target ,停止循環並返回 -1
我們可以發現,二分查找的邏輯其實不難,但它在實現過程中,涉及到不少邊界條件,很容易弄亂,因此我們在實現過程中必須對變量的區間考慮清楚。
代碼實現--while循環,非遞歸
class Solution:
def binary_search(self, nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] > target:
right = mid - 1
elif nums[mid] < target:
left = mid + 1
else:
return mid
return -1
代碼實現--遞歸
class Solution:
def binary_search(self, nums, target):
return self.binary_search_recursive(nums, target, 0, len(nums) - 1)
def binary_search_recursive(self, nums, target, left, right):
if left > right:
return -1
mid = (left + right) // 2
if nums[mid] > target:
return self.binary_search_recursive(nums, target, left, mid - 1)
elif nums[mid] < target:
return self.binary_search_recursive(nums, target, mid + 1, right)
else:
return mid
更多Python編程題,等你來挑戰:Python編程題彙總(持續更新中……)