二分查找算法是最常用的一种高效算法,所以本文将常见的情形做一个总结,得到一个二分查找的模板,方便应对各种二分查找中的问题。
当前有一个有序的数列:
1, 5, 9 【每个数字都是唯一的】
1, 2, 2, 9 【存在重复的数字】
模板
该模板可以在数列中查找一个数target,如果target在数列中存在,输出target第一次出现位置下标,如果不存在,则输出插入到数列中之后的下标。
int binarySearch(vector<int>& numbers, int target) {
int len = numbers.size();
int l = 0, r = len, mid = l+(r-l)/2;
while (l < r) {
if (numbers[mid] >= target) {
r = mid;
} else {
l = mid+1;
}
mid = l+(r-l)/2;
}
return r;
}
// 样例
数列: 1 5 9
target : 1 output : 0
target : 5 output : 1
target : 9 output : 2
target : 0 output : 0
target : 10 output : 3
target : 4 output : 1
数列: 1 2 2 9
target : 1 output : 0
target : 2 output : 1
target : 9 output : 3
target : 0 output : 0
target : 10 output : 4
target : 4 output : 3