一、什么是二分法
二分法, 是时间复杂度为O(logn)的一种方法。其核心思想是:在一个已经排序好的数组中,每次取中间值。在每次比较中间值与查找目标的过程中,可以排除掉一半的数据。
二、二分法模版
最基础的二分法模版,对二分法题型非常实用。
模版:
//设置执行条件为start + 1 < end, 之后在单独处理start跟end
//更加通用,完全杜绝infinity loop
while(start + 1 < end){
int mid = start + (start - end)/2; // 防止stack overflow
if(array[mid] > target){
end = mid;
}
else if(array[mid] < target){
start = mid;
}
else {
end = mid;
}
}
if(nums[start] == target){
return start;
}
if(nums[end] == target){
return end;
}
三、四种二分法题型
在面试题里,根据所给数据集对二分法有四种归类。
1.单调数据集二分
在这类题型里,所给的数据集是单调递增(递减)的,需要使用一次或多次标准二分法模版来找到元素的位置。
2.有序不单调数据集二分
数据集是有序的但并不单调。比如: [4, 5, 6, 0 ,1, 2] [1, 3, 4, 7, 6, 2]
一般思路为:
- 使用二分法找到一个元素的位置,把数据集分成两个单调数据集
- 二分法处理单调数据集
第一步的二分法中,可以利用两端点值 + 单调性来找到那个把数据集分割成两个单调数据集的点。
3.无序数据集二分
数据集无序,二分的时候要根据条件去掉一半数据,对另一半数据继续二分。难点在于找判断条件,其它过程跟普通二分法一样。
4.答案集二分
没有给出数据集,需要自己创造一个答案集(包含答案的集合)。然后对答案集使用二分法,找到答案。
六、题目
https://blog.csdn.net/Kejonho/article/details/109134535