- 在一个有序数组中,找到某个数是否存在
public static int binarySearch(int[] arr, int target) {
if (arr == null || arr.length == 0) {
return -1;
}
int L = 0;
int R = arr.length - 1;
while (L <= R) {
int mid = L + ((R - L)>>1);
System.out.println("L:"+L+",R:"+R+",mid:"+mid+",value:"+arr[mid]);
if (arr[mid] == target) {
return mid;
} else if (arr[mid] > target) {
R = mid - 1;
} else {
L = mid + 1;
}
}
return -1;
}
- 在一个有序数组中,找>=某个数最左侧的位置
//找出>=target 最左位置
public static int nearestLeftIndex(int[] arr, int target) {
int L = 0;
int R = arr.length - 1;
int index = -1;//记录>=最左侧的位置
while (L <= R) {
int mid = L + ((R - L)>>1);
if (arr[mid] >= target) {//找>=target的位置,满足条件就更新index位置值
index = mid;
R = mid - 1;
} else {
L = mid + 1;
}
}
return index;
}
- 在一个有序数组中,找<=某个数最右侧的位置
//找出<= target 最右位置
public static int nearestRightIndex(int[] arr, int target) {
int L = 0;
int R = arr.length - 1;
int index = -1;//记录<=最右侧的位置
while (L <= R) {
int mid = L + ((R - L)>>1);
if (arr[mid] <= target) {//找<=target的位置,满足条件就更新index位置值
index = mid;
L = mid + 1;
} else {
R = mid - 1;
}
}
return index;
}
4.局部最小
局部最小定于:
- 0位置的数,如果比1位置的数小则0位置的数是局部最小
- N位置的数,如果比N-1位置的数小则N位置的数是局部最小
- i位置的数,比i-1和i+1位置的数都小则i位置的数局部最小 数组无序,且任意相邻的两个数都不相等,找出任一一个局部最小值
public static int getLessIndex(int[] arr) {
if (arr == null || arr.length == 0) {
return -1;
}
if (arr.length == 1 || arr[0] < arr[1]) {
return 0;
}
if (arr[arr.length - 1] < arr[arr.length - 2]) {
return arr.length - 1;
}
int left = 1;
int right = arr.length - 2;
int mid = 0;
while (left < right) {
mid = (left + right) / 2;
if (arr[mid] > arr[mid - 1]) {
right = mid - 1;
} else if (arr[mid] > arr[mid + 1]) {
left = mid + 1;
} else {
return mid;
}
}
return -1;
}
找到可以排除一半不符合的值并保持逻辑正确就可以用二分。