正常版本
/**
* 二分查找,找到该值在数组中的下标,否则为-1
*/
public static int binarySerach(int[] array, int key) {
int left = 0;
int right = array.length - 1;
// 这里必须是 <=
while (left <= right) {
int mid = left + (right-left)/2; // 养成习惯
if (array[mid] == key) {
return mid;
}
else if (array[mid] < key) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
return -1;
}
加强版1:查找第一个与key相等的元素
查找第一个相等的元素,也就是说等于==查找key值的元素有好多个==,返回这些元素==最左边==的元素下标。
// 查找第一个相等的元素
public static int findFirstEqual(int[] array, int key) {
int left = 0;
int right = array.length - 1;
// 这里必须是 <=
while (left <= right) {
int mid = left + (right-left)/2;
if (array[mid] >= key) { // ==更改的地方== 即发现第一个=的时候
right = mid - 1;
}
else {
left = mid + 1;
}
}
if (left < array.length && array[left] == key) {
return left;
}
return -1;
}
加强版2:查找最后一个与key相等的元素
查找最后一个相等的元素,也就是说等于查找key值的==元素有好多个==,返回这些元素==最右边==的元素下标。
// 查找最后一个相等的元素
static int findLastEqual(int[] array, int key) {
int left = 0;
int right = array.length - 1;
// 这里必须是 <=
while (left <= right) {
int mid = left + (right-left)/2;
if (array[mid] <= key) { // ===更改的地方===
left = mid + 1;
}
else {
right = mid - 1;
}
}
if (right >= 0 && array[right] == key) {
return right;
}
return -1;
}
总结: 套路+思考
// 这里必须是 <=
while (left <= right) {
int mid = left + (right-left)/2;
if (array[mid] ? key) { /// 比较符号
//... right = mid - 1;
}
else {
// ... left = mid + 1;
}
}
return xxx; // 返回值
1 首先判断出是返回left,还是返回right
最后的跳出条件是 left > right ,left和right 是key的边界地方,看需求,选择其中一个
2 判断出比较符号
看 中间值 与 key的 关系 。
网友评论