摘要:二分查找的基本思想是「减而治之」,即逐渐缩小搜索区间。「减而治之」是「分而治之」的特例,「分治算法」在拆分子问题、并解决子问题以后,需要合并子问题的解。
而「减治算法」可以适用的问题,每一次把问题的规模缩小到原来的一半,即每一次把问题转换成为其中一个子问题。
生活中的二分查找
猜价格游戏。
二分查找入门问题
二分查找的基本问题是「力扣」第 704 题。
public class Solution {
public int search(int[] nums, int target) {
int len = nums.length;
int left = 0;
int right = len - 1;
// 目标元素可能存在在区间 [left..right]
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
// 下一轮搜索区间 [mid + 1..right]
left = mid + 1;
} else {
// 下一轮搜索区间 [left..mid - 1]
right = mid - 1;
}
}
return -1;
}
}
请大家思考:
- 为什么需要取中间数?
- 取三分之一位置、四分之三位置是不是可以?
答案:输入数组有序,取区间里的任意一个位置都可以,在对区间一无所知的情况下,取中间是最好的。