Leetcode 二分查找总结-
普通二分查找:
/**
* 二分查找,找到该值在数组中的下标,否则为-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) { //这里是小于号,可以加上等于(加上等于左边界不断递增,就是查找最后一个等于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;
}