精准查找
public static int binarysearch ( int [ ] nums, int target) {
int start= 0 ;
int end= nums. length- 1 ;
while ( start< end) {
int mid= ( start+ end) / 2 ;
if ( nums[ mid] == target) {
return mid;
}
else if ( nums[ mid] > target) {
end= mid- 1 ;
} else {
start= mid+ 1 ;
}
}
return - 1 ;
}
模糊查找
找到第一个等于准确值的数
public static int binarysearchFirst ( int [ ] nums, int target) {
int start= 0 ;
int end= nums. length- 1 ;
while ( start<= end) {
int mid= ( start+ end) / 2 ;
if ( nums[ mid] < target) {
start= mid+ 1 ;
} else if ( nums[ mid] == target) {
if ( mid== 0 || nums[ mid- 1 ] != target) {
return mid;
} else {
end= mid- 1 ;
}
} else {
end= mid- 1 ;
}
}
return - 1 ;
}
找到最后一个等于准确值的数
public static int binarysearchLast ( int [ ] nums, int target) {
int start= 0 ;
int end= nums. length- 1 ;
while ( start<= end) {
int mid= ( start+ end) / 2 ;
if ( nums[ mid] > target) {
end= mid- 1 ;
} else if ( nums[ mid] == target) {
if ( mid== nums. length- 1 || nums[ mid+ 1 ] != target) {
return mid;
} else {
start= mid+ 1 ;
}
} else {
start= mid+ 1 ;
}
}
return - 1 ;
}
找到第一个大于准确值的数
public static int binarysearchFirstBig ( int [ ] nums, int target) {
int start= 0 ;
int end= nums. length- 1 ;
while ( start<= end) {
int mid= ( start+ end) / 2 ;
if ( nums[ mid] <= target) {
start= mid+ 1 ;
} else {
if ( mid== 0 || nums[ mid- 1 ] <= target) {
return mid;
} else {
end= mid- 1 ;
}
}
}
return - 1 ;
}
找到最后一个小于准确值的数
public static int binarysearchLastSmaller ( int [ ] nums, int target) {
int start = 0 ;
int end = nums. length - 1 ;
while ( start <= end) {
int mid = ( start + end) / 2 ;
if ( nums[ mid] >= target) {
end = mid - 1 ;
} else {
if ( mid == nums. length - 1 || nums[ mid + 1 ] >= target) {
return mid;
} else {
start = mid + 1 ;
}
}
}
return - 1 ;
}