二分简介
- 适用条件:有序数组
- 原理:通过比较中间元素和目标值来逐步缩小搜索范围,每次将搜索范围减半,从而加快查找速度
- 时间复杂度:O(logn)
- 流程:
- 初始化左右指针:
left初始化为0,right初始化为array.length - 1。 - 计算中间位置:避免
(left + right) / 2可能导致的整数溢出,使用left + (right - left) / 2。 - 比较和移动指针:
- 如果
mid位置的元素是目标,根据不同要求做不同处理(看后文) - 如果目标较大,移动左指针到
mid + 1。 - 如果目标较小,移动右指针到
mid - 1。 - 循环直至找到元素或指针重合:使用
while(left <= right)保证在所有元素都被检查之前循环继续。
基本模版
查找指定数字的位置
查找指定数字第一次出现的位置
查找指定数字最后一次出现的位置
归纳
- 对于上面的三种应用场景,无论是查找数字位置、第一次出现的位置、最后一次出现的位置,都有下面的处理:
- nums[mid] < target:left = mid + 1
- nums[mid] > target:right = mid - 1;
- 不同点在于当nums[mid] == target时:
- 查找数字出现位置:直接返回
- 查找数字首次出现的位置:right = mid - 1(在左半区继续查找)
- 查找数字最后出现的位置:left = mid + 1(在右半区继续查找)
题目
- Author:CoderWdd
- URL:https://www.wuinsights.top//article/01HVC5H1PVK4JXBHERFSJEMZ90
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts
