严格单调递增序列,常见的两种代码
int find(int t, int* a, int n)
{
int lo=0;
int hi=n-1;//include
while(lo<=hi)
{
int mid=(lo+hi)/2;//closer to lo
if(a[mid]==t)
{
return mid;
}
if(t<a[mid])
{
hi=mid-1;
}
else
{
lo=mid+1;
}
}
return -1;
}
int find(int t, int* a, int n)
{
int lo=0;
int hi=n;//exclude
while(lo<=hi)//if lo<hi here, then the last return must be return a[lo]==t?lo,-1;
{
int mid=(lo+hi)/2;//closer to lo
if(a[mid]==t)
{
return mid;
}
if(t<a[mid])
{
hi=mid-1;
}
else
{
lo=mid+1;
}
}
return -1;
}
对应第一种代码,在存在重复元素时,返回第一个元素的下标
int find_first(int t, int* a, int n)
{
int lo=0;
int hi=n-1;//include
while(lo<hi)
{
int mid=(lo+hi)/2;//closer to lo
if(a[mid]==t)
{
hi=mid;
}
if(t<a[mid])
{
hi=mid-1;
}
else
{
lo=mid+1;
}
}
return a[lo]==t?lo:-1;
}
对于第一种代码,在存在重复元素时,返回最后一个元素的下标:
int find_last(int t, int* a, int n)
{
int lo=0;
int hi=n-1;//include
while(lo<hi)
{
int mid=hi+(lo-hi)/2;//closer to hi
if(a[mid]==t)
{
lo=mid;
}
if(t<a[mid])
{
hi=mid-1;
}
else
{
lo=mid+1;
}
}
return a[lo]==t?lo:-1;
}
对应第二种代码,在存在重复元素时,返回第一个元素的下标:
对于第二种代码,在存在重复元素时,返回最后一个元素的下标:
懒得写了,就这样的吧。。。最近脑袋总是晕晕的。。。