二分查找分为两个模板分别为:查找该数最小位置和最大位置,言简意赅就是出现的最近的地方和最远的地方,而在这两个区间内的数肯定都是目标数;二分查找的前提是数组单调,如果输入一个无规律数组则需要先进行排序再套用二分查找。
check(mid)一般都是与题目有关的不等式,在实际解题的过程中需要灵活变通;
//如果题目明确说了 要求最小值(最前面的值)还是求最大值(最后面的值),就能判断是用模板1(求最小),还是用模板2(求最大)。
//之后再根据模板1,或模板2,写出对应的判断条件;
关于查找最近点的代码:
若题目说查找...最小下标,则是 if(check(mid)) r = mid ;else l = mid + 1; 旨在使得l指针不断向又靠近,最终得到的会是最小下标,不妨举一个例子 1 2 2 3 5 当第一次二分时下标指向的是2,下标是2,此时r = mid ,l不变;第二次二分时,下标为1,指向的数字是2此时此刻r=1了...不断循环往复直到l=r的时候循环结束,l也就是我们要找的最小小标
int l = 0 , r =n;
while(l<r)
{
int mid = l+r >> 1;
if(check(mid)) r = mid ;
else l = mid + 1;
}
而关于找到最大下标与找最小下标相类似,只不过是指针移动方向改变了,是让右指针不断往左移动,让最终l指向最大下标。
while(l<r)
{
int mid = l + r + 1 >> 1;
if(check(mid)) l = mid;
else r = mid - 1;
}
如果忘记了在脑海里想象有个指针不断往左或者往右移动的过程或许你就会茅塞顿开