二分查找小技巧
多设置了一个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;
}