说到二分,首先想到二分查找,这个我一般都是这样写的:
//在长度为n的数组a[]里找到gold并返回下标,若不存在返回-1
int BinarySearch(int n, int a[], int gold)
{
int L = 0, R = n-1;
while(L < R)
{
int mid = (L+R)/2;
if(a[mid] < gold)
L = mid;
else if(a[mid] > gold)
R = mid;
else
return mid;
}
return -1;
}
然后在实际用到的时候基本都会发现会陷入死循环,于是我一般都会把while(L < R)改成while(L < R-1),然后还要提前判断一下初始L,R是不是满足条件,然后balabala的,总之就是以上面那段代码为模板瞎改改,但R=mid和L=mid,以及那个while里面的<是固定的。以前这样都是可以糊弄过去,直到这两天做一个题,用到二分,但稍微有点复杂,问了一下队友才知道,二分赋值时并不是R=mid,L=mid,而一般都是R=mid-1,L=mid+1,然后我才知道我一直用的二分都是有问题的~
后来发现,这样会漏掉一些数,然后队友说他也不清楚,对于不同的题有时候也是瞎改改——和我差不多的那种。然后我仔细想了想,发现while里面要写成L<=R,这样就完美了~
即:
//在长度为n的数组a[]里找到gold并返回下标,若不存在返回-1
int BinarySearch(int n, int a[], int gold)
{
int L = 0, R = n-1;
while(L <= R)
{
int mid = (L+R)/2;
if(a[mid] < gold)
L = mid+1;
else if(a[mid] > gold)
R = mid-1;
else
return mid;
}
return -1;
}
具体为啥,我懒地解释了,haha