> [!前提条件]
> > 有序数组:必须
> > (数组中无重复元素):非必须
> [!注意]
> > 边界条件(区间开闭):影响初始值设定、循环终止条件、指针移动方式
> > 循环不变量:在循环开始、中间、结束时都不改变的性质,如边界条件
# 704、二分查找
思路
左右指针->中间指针
每次将中间指针的值与目标值比较
决定移动左/右指针
注意
区间开闭 [left, right) or [left, right]
移动左指针时是 left = middle+1
移动右指针时是 right = middle 还是 -1
循环终止条件是 left<right 还是 left<=right
右指针初始值是 right = len 还是 right = len-1
防止溢出
取中间指针时
不用 middle = int((left + right) / 2)
而是采用 middle = left + int((right - left ) / 2)
其实没太大区别
# 35、搜索插入位置
思路
同上,返回找到时的 middle 和未找到时的 left
注意
未找到时如何返回值
# 34、在排序数组中查找元素的第一个和最后一个位置
思路
分别找左右端点
两次二分法
注意
特殊情况处理
未找到:在范围中、不在范围中(左右端点外)
# 69、x 的平方根
思路
二分法
e^(1/2 ln(x))
牛顿迭代法
# 367、有效的完全平方数
思路
算平方根是不是整数
二分法
牛顿迭代法