歡迎關注 leetcode 專欄
題目
給定一個 n 個元素有序的(升序)整型數(shù)組 nums 和一個目標值 target 雷激,寫一個函數(shù)搜索 nums 中的 target把敞,如果目標值存在返回下標,否則返回 -1嘀粱。
示例 1:
輸入: nums = [-1,0,3,5,9,12], target = 9
輸出: 4
解釋: 9 出現(xiàn)在 nums 中并且下標為 4
示例 2:
輸入: nums = [-1,0,3,5,9,12], target = 2
輸出: -1
解釋: 2 不存在 nums 中因此返回 -1
提示:
- 你可以假設 nums 中的所有元素是不重復的住诸。
- n 將在 [1, 10000]之間刺啦。
- nums 的每個元素都將在 [-9999, 9999]之間。
鏈接:https://leetcode-cn.com/problems/binary-search
解法
常規(guī)解法
class Solution:
def search(self, nums: list, target: int) -> int:
left, right = 0, len(nums) - 1
while left <= right:
middle = left + (right - left) // 2
if nums[middle] < target:
left = middle + 1
elif nums[middle] > target:
right = middle - 1
else:
return middle
return -1
空間復雜度 O(1)军洼,只是額外申請了幾個變量的空間玫荣。
時間復雜度 O(logn)甚淡,就是二分查找的復雜度,2^k = n —— k ∝ logn捅厂。
遞歸解法
class Solution:
def search(self, nums: list, target: int) -> int:
return self.get_index(nums, target, 0, len(nums) - 1)
def get_index(self, nums, target, left, right):
if left > right: return -1
middle = left + (right - left) // 2
if nums[middle] < target:
return self.get_index(nums, target, middle + 1, right)
elif nums[middle] > target:
return self.get_index(nums, target, left, middle - 1)
else:
return middle
空間復雜度 O(logn)贯卦,最差情況下遞歸的深度就是logn。
時間復雜度 O(logn)焙贷,不變撵割。
image.png
Python專屬解法
又到了 Python 的作弊時間了……
class Solution:
def search(self, nums: list, target: int) -> int:
try:
return nums.index(target)
except ValueError:
return -1
更多刷題,盡在 leetcode 專欄