力扣二分查找
程序员文章站
2024-01-04 12:48:40
...
力扣二分查找
思想
二分查找是计算机科学中最基本、最有用的算法之一。 它描述了在有序集合中搜索特定值的过程。
二分查找中使用的术语:
目标 Target —— 你要查找的值
索引 Index —— 你要查找的当前位置
左、右指示符 Left,Right —— 我们用来维持查找空间的指标
中间指示符 Mid —— 我们用来应用条件来确定我们应该向左查找还是向右查找的索引
要求
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
提示:
你可以假设 nums 中的所有元素是不重复的。
n 将在 [1, 10000]之间。
nums 的每个元素都将在 [-9999, 9999]之间。
思路
1.注意是有序的才可以用二分查找
2.初始化最低坐标low=0和最高位置索引一般为high=len(nums)或者len(nums)-1都可以这是边界条件要注意区分
3.定义中间位置为low +high的一半,如果数nums[mid]的数大于target 那么目标数一定在左边即0~(low+high)//2 这个区域,那么把最high的位置索引更新为mid,反之就把low=mid 即可
**4.这里必须要不停的更新mid所以用一个循环,如果最小的大于最大的就证明当前左边这块区域的数或者右边这块区域的数都没找到,就证明没有 **
例如[ 1,2,3,4] target=3 mid=(0+3)//2 中间数就是2,就是左边[1,2] 右边[3,4]很明显这个数小于目标值targe 那就在右边区域,如此low=2,high=3 mid=(2+3)//2,mid=2, 此时中间数nums[2]=3就找到了目标数。就完成这个过程。
代码片
class Solution:
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
low=0
high=len(nums)
if len(nums)==0:
return -1
while low<high:
mid=(low+high)//2
if nums[mid]==target:
return mid
if nums[mid]<target:
low=mid+1
if nums[mid]>target:
high=mid
return -1