789. 数的范围 (整数二分)
作者:
knighz
,
2022-01-23 09:09:38
,
所有人可见
,
阅读 179
快排:while(l<r)
归并:while (i<=mid && j<=r)
二分:while(l<r)
/*二分里面if的条件:
首先mid可能有l+r+1 >>1
if(a[mid] >= x) 或 if(a[mid] <= x) **这里是看具体怎么不成立,方便下一条代码调整**
if对应— r=mid 或 l=mid
else对应— l=mid+1 或 r=mid-1 */
while(q --)
{
int a1, a2;
int x;
cin >> x;
int l = 0, r = n-1;
while(l<r)
{
int mid = l+r>>1;
if(a[mid] >= x) r = mid;
else l = mid + 1;
}
a1 = l;
/*这里要判断一下a1有无找到x,如果没有说明接下来再二分也找不到了*/
if(a[l] != x) printf("-1 -1\n");
else //如果找得到x,则找一下起始位置
{
l = 0, r = n-1; //不用再定义int
while(l<r)
{
int mid = l+r+1 >> 1;
if(a[mid] <= x) l = mid;
else r = mid - 1;
}
a2 = l;
printf("%d %d\n", a1, a2); //在else中打印出来就没错。
}
}