三种查找的代码如下:
//1.查找值是否存在
public static int search(int[] arr, int x) {
int l = 0, r = arr.length - 1;
while (l < r) {
int mid = (l + r) >> 1;
if (arr[mid] > x) {
r = mid - 1;
} else if (arr[mid] < x) {
l = mid + 1;
} else {
return mid;
}
}
return l;
}
//2.查找值最后一次出现
public static int searchR(int[] arr, int x) {
int l = 0, r = arr.length - 1;
while (l < r) {
int mid = (l + r) >> 1;
if (arr[mid] > x) {
r = mid - 1;
} else if (arr[mid] <= x) {
l = mid;
}
}
return l;
}
//3.查找第一次出现
public static int searchL(int[] arr, int x) {
int l = 0, r = arr.length - 1;
while (l < r) {
int mid = (l + r) >> 1;
if (arr[mid] < x) {
l = mid + 1;
} else if (arr[mid] >= x) {
r = mid;
}
}
return l;
}
1.最普通的二分查找没什么可说的。
2.查找右值与左值,关键在于等于值了怎么处理。
l,r指针相当于确定了一个窗口,我们要做的就是不断的缩小窗口。
不包含等于的那一侧固定死了窗口的一边。我们要做的就是不断的缩小窗口,就当窗口的另一侧不断的等于mid即可。