二分查找基础版
public static int binarySearch(Integer[] list, int index) { int i = 0; int j = list.length - 1; while (i <= j) { int m = i + j >>> 1; if (list[m] < index) { i = m + 1; } else if (index < list[m]) { j = m - 1; } else { return m; } } return -1; }
二分查找基础版的时间复杂度是O(log n),空间复杂度是O(1)
二分查找通过两个指针和中间值来找到数据
二分查找改进版
public static int binarySearch(Integer[] list, int index) { int i = 0; int j = list.length; while (i < j) { int m = i + j >>> 1; if (list[m] < index) { i = m + 1; } else if (index < list[m]) { j = m; } else { return m; } } return -1; }
相比于基础版,改进版不需要将 j 视为有可能是需要找的值
二分查找平衡版
public static int binarySearch(Integer[] list, int index) { int i = 0; int j = list.length; while (1 < j - i) { int m = i + j >>> 1; if (index < list[m]) { j = m; } else { i = m; } } return (index == list[i]) ? list[i] : -1; }
二分查找Leftmost方法
public static int binarySearch(Integer[] list, int index) { int i = 0; int j = list.length - 1; while (i <= j) { int m = i + j >>> 1; if (index <= list[m]) { j = m - 1; } else { i = m + 1; } } return i; }
二分查找Rightmost方法
public static int binarySearch(Integer[] list, int index) { int i = 0; int j = list.length - 1; while (i <= j) { int m = i + j >>> 1; if (list[m] <= index) { i = m + 1; } else { j = m - 1; } } return j; }
力扣第34题.在排序数组中查找元素的第一个和最后一个位置
class Solution { public int[] searchRange(int[] nums, int target) { Solution s = new Solution(); int i = s.searchUtils(nums,target,true); if(i == -1) { return new int[]{-1,-1}; } else { return new int[]{i,s.searchUtils(nums,target,false)}; } } public int searchUtils(int[] nums, int target, boolean isLeft) { int i = 0, j = nums.length - 1; int a = -1; while(i <= j) { int m = i + j >>> 1; if(target < nums[m]) { j = m - 1; } else if(nums[m] < target) { i = m + 1; } else { if(isLeft) { a = m; j = m - 1; } else { a = m; i = m + 1; } } } return a; } }