这个题解使用了二分查找的思路。首先定义了两个指针lo和hi,分别指向数组的开始和结束位置。然后使用while循环不断缩小搜索区间,每次循环都计算中间位置mid,并比较nums[mid]和target的大小。如果相等则直接返回mid;如果nums[mid]大于target,则将搜索区间缩小到[lo, mid-1];如果nums[mid]小于target,则将搜索区间缩小到[mid+1, hi]。循环结束后,如果lo在数组范围内且nums[lo]等于target,则返回lo,否则返回-1。
时间复杂度: O(log n)
空间复杂度: O(1)
class Solution:
def search(self, nums: List[int], target: int) -> int:
lo = 0
hi = len(nums)
while lo < hi:
# 计算中间位置
mid = lo + (hi - lo) // 2
if nums[mid] == target:
# 找到目标值,直接返回下标
return mid
elif nums[mid] > target:
# 目标值在左半部分,缩小搜索区间到[lo, mid-1]
hi = mid - 1
elif nums[mid] < target:
# 目标值在右半部分,缩小搜索区间到[mid+1, hi]
lo = mid + 1
# 循环结束后,如果lo在数组范围内且nums[lo]等于target,返回lo,否则返回-1
return lo if len(nums)-1 >= lo >= 0 and nums[lo] == target else -1