二分查找
一、在一个有序数组中,查找某个数是否存在,时间复杂度O(logN)
这个基本的二分查找中有一个缺陷,在一些有重复元素的数组中,比如[1,2,2,2,3,3,4],这个数组中,假设我们查找2这个元素,我们会直接返回下标3,如果要寻找最左侧的数,显然不符合了。
public static int binarySearch(int[] arr, int num) { int left = 0; int right = arr.length - 1; // 确定搜索区间是:[0, len-1] while (left <= right) { // 这里如果是<, 相等情况下[3,3],这种情况将不会被考虑,或者最后;return arr[left] == num ? left, -1 int mid = left + ((right - left) >> 1); // (left + right) / 2 || left + (right - left) / 2 if (arr[mid] == num) return mid; else if (arr[mid] > num) { right = mid - 1; } else if (arr[mid] < num) { left = mid + 1; } } return -1; }
二、在一个有序数组中,找>=某个数最左侧位置,或者<=某个数最右侧位置