一、二分查找
题目704.二分查找.
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
题目中的前提条件有:
1.数组为有序数组
2.数组中无重复元素
数组有序是使用二分法的前提,而且如果有重复元素,二分查找返回的元素下标可能不是唯一的,这些都是使用二分法的前提,看到题目满足如上条件时,可以考虑一下是不是可以使用二分法。
二分法的思想虽然简单,但涉及边界条件,需要清楚定义区间,也就是定义不变量,在二分查找的过程中(即while),每一次边界的处理都要坚持根据区间的定义来操作。
一般来说可以使用左闭右闭,即[left,right],定义target在这个区间里。
因此需要注意以下两点:
- while(left <= right),这里使用<=,因为left==right是有意义的
- if(nums[mid] > target)时,right赋值为mid-1,因为当前的nums[mid]不可能等于target,相反left就该赋值为mid+1
题解:
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] == target:
return mid
elif nums[mid] > target:
right = mid - 1
else:
left = mid + 1
return -1
理解之后可以做一下以下题目:
35.搜索插入位置.
34. 在排序数组中查找元素的第一个和最后一个位置.