适用场景
数组为有序数组,同时题目还强调数组中无重复元素
典型的力扣代码原题:-
1、力扣-704.二分位查找
对应链接为:
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
left = 0
right = len(nums) - 1
while left <= right:
middle = left + (right - left) // 2
if nums[middle] > target:
right = middle - 1
elif nums[middle] < target:
left = middle + 1
else:
return middle
return -1
2、力扣-35. 搜索插入位置
参考代码:
class Solution(object):
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
left=0
right=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 left
示例 2:
输入: nums = [1,3,5,6], target = 2 输出: 1
此时进入分支判断
elif nums[middle]>target: right=middle-1
运行得到right=0
还是满足left<=right这个循环条件(left为0,right=0)
得出middle=0
满足判断条件
if nums[middle]<target: left=middle+1
此时得出left=1,right=0,middle=0
不满足循环条件,退出循环
返回left=1,此时`left`会指向比目标值大的第一个元素的索引
同理 示范3 的图解如下,步骤详解略
3、34. 在排序数组中查找元素的第一个和最后一个位置
4、x的平方根
解题目思路:
代码:
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
if x == 0:
return 0
if x == 1:
return 1
left=1
right=x
while (left<right):
midlle=left+(right-left)//2
if midlle*midlle>x:
right=midlle
elif midlle*midlle<x:
left=midlle+1
else:
return midlle
return left-1
5、367. 有效的完全平方数
class Solution(object):
def isPerfectSquare(self, num):
"""
:type num: int
:rtype: bool
"""
left=0
right=num
while left<=right:
middle=left+(right-left)//2
if middle*middle<num:
left=middle+1
elif middle*middle>num:
right=middle-1
else:
return True
return False