有序数组中找到给定的num
每次都取中点数与num比较 如果中点数比num小,则左边界来到中点数+1的位置,将右侧部分再进行二分 如果中点数比num大,则右边界来到中点数-1的位置,将左侧部分在进行二分
public static boolean exist(int[] arr, int num) {if (arr == null || arr.length == 0) {return false;}int l = 0;int r = arr.length - 1;int mid = 0;while (l < r) {mid = l + ((r - l) >> 2);if (arr[mid] == num) {return true;}if (arr[mid] > num) {r = mid - 1;} else if (arr[mid] < num) {l = mid + 1;}}return arr[l] == num;}
有序数组中找到>=num最左的位置
二分法找相等的数题目变种,只要有>=num的数据,就记录下标,且右边界 = 二分索 - 1,直到二分全部执行完毕返回记录的下标位置
public int nearestIndex(int[] arr, int number) {if (arr == null || arr.length == 0) {return -1;}int l = 0;int r = arr.length - 1;int mid = 0;int index = -1;while (l < r) {mid = l + ((r - l) >> 2);if (arr[mid] >= number) {r = mid - 1;index = mid;} else {l = mid + 1;}}return arr[l] >= number ? l : index;}
有序数组中找到<=num最右的位置
二分法找相等的数题目变种,只要有<=num的数据,就记录下标,且左边界 = 二分索引 + 1,直到二分全部执行完毕返回记录的下标位置
public static int nearestIndex(int[] arr, int number) {if (arr == null || arr.length == 0) {return -1;}int l = 0;int r = arr.length - 1;int mid = 0;int index = -1;while (l <= r) {mid = l + ((r - l) >> 2);if (arr[mid] <= number) {index = mid;l = mid + 1;} else {r = mid - 1;}}return index;}
给定一个数组arr,已知任何两个相邻的数都不相等,找到随便一个局部最小位置返回
局部最小值问题 定义何为局部最小值: arr[0] < arr[1],0位置是局部最小; arr[N-1] < arr[N-2],N-1位置是局部最小; arr[i-1] > arr[i] < arr[i+1],i位置是局部最小;
public int getLessIndex(int[] arr) {if (arr == null) {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 l = 1;int r = arr.length - 2;if (arr[r] < arr[r - 1]) {return r;}int mid = 0;while (l < r) {mid = l + ((r - l) >> 2);if (arr[mid] > arr[mid - 1]) {r = mid - 1;} else if (arr[mid] > arr[mid + 1]) {l = mid + 1;} else {return mid;}}return l;}
