二分查找小技巧

多设置了一个ans变量,每次找到一个等于val的值,我就用它的序号覆盖ans,这样,由于我们的寻找方向是正确的,因此最后ans记录的序号,肯定就是我们需要的答案,同时,如果不存在,则ans已经初始为-1,因此,最后直接返回ans即可。看下面5个例子。

第一,求任意一个i使得num[i]等于val,不存在返回-1;

View Code
int BinarySearch(int low, int high, int val)
{
int ans = -1;
while(low <= high){
int mid = (low + high) / 2;
if(num[mid] <= val){
low = mid + 1;
if(num[mid] == val){
ans = mid;
break;
}
}
else{
high = mid - 1;
}
}
return ans;
}

第二,求最大的i使得num[i]等于val,不存在返回-1;

View Code
int BinarySearch(int low, int high, int val)
{
int ans = -1;
while(low <= high){
int mid = (low + high) / 2;
if(num[mid] <= val){
low = mid + 1;
if(num[mid] == val){
ans = mid;
}
}
else{
high = mid - 1;
}
}
return ans;
}

第三,求最小的i使得num[i]等于val,不存在返回-1;

View Code
int BinarySearch(int low, int high, int val)
{
int ans = -1;
while(low <= high){
int mid = (low + high) / 2;
if(num[mid] < val){
low = mid + 1;
}
else{
high = mid - 1;
if(num[mid] == val){
ans = mid;
}
}
}
return ans;
}

第四,求最大的i使得array[i]小于val,不存在返回-1;

View Code
int BinarySearch(int low, int high, int val)
{
int ans = -1;
while(low <= high){
int mid = (low + high) / 2;
if(num[mid] < val){
low = mid + 1;
ans = mid;
}
else{
high = mid - 1;
}
}
return ans;
}

第五,求最小的i使得array[i]大于val,不存在返回-1

View Code
int BinarySearch(int low, int high, int val)
{
int ans = -1;
while(low <= high){
int mid = (low + high) / 2;
if(num[mid] <= val){
low = mid + 1;
}
else{
high = mid - 1;
ans = mid;
}
}
return ans;
}
posted @ 2012-03-27 22:33  爱也玲珑  阅读(618)  评论(0编辑  收藏  举报