递归:时间复杂度O(log n)
public int search(int[] nums, int target) { if (target < nums[0] || target > nums[nums.length - 1]) { return -1; } return binarySearch(nums, 0, nums.length - 1, target); } public int binarySearch(int[] nums, int left, int right, int target) { int l = left; int r = right; int mid = l + ((r - l) / 2); int midVal = nums[mid]; while (l <= r) { if (target < midVal) { return binarySearch(nums, l, mid - 1, target); } else if (target > midVal) { return binarySearch(nums, mid + 1, r, target); } else { return mid; } } return -1; }
非递归
public static int binarySearch(int[] nums, int target) { //目标值不在数组大小范围内,直接返回-1; if (target < nums[0] || target > nums[nums.length - 1]) { return -1; } int left = 0; int right = nums.length - 1; //这里加 = 号是因为我们采用的是 左闭右闭的区间。故此=号是有意义的。 while (left <= right) { int mid = left + ((right - left) / 2); if (target < nums[mid]) { right = mid - 1; } else if (target > nums[mid]) { left = mid + 1; } else { return mid; } } //找不到,直接返回-1 return -1; }