二分查找及变形
二分查找是在完全有序数组(或部分有序)中对某一元素进行快速查找的算法。时间复杂度为O(logn)。
实现方式有递归和非递归。
非递归实现
public int binarySearch(int[] nums, int key) { if (nums == null || nums.length == 0) { return -1; } int low = 0, high = nums.length - 1; while (low <= high) { int mid = low + (high - low) / 2; if (nums[mid] == key) { return mid; } if (nums[mid] < key) { low = mid + 1; } else { high = mid - 1; } } return -1; }
变形1:查找数组中最接近某一元素(即小于)的元素位置。
public int findMaxMin(int[] nums, int key) { if (nums == null || nums.length == 0) { return -1; } int low = 0, high = nums.length - 1; while (low + 1 < high) { int mid = low + (high - low) / 2; if (nums[mid] < key) { low = mid; } else { high = mid - 1; } } if (nums[high] < key) { return high; } if (nums[low] < key) { return low; } return -1; }