二分查找
704.二分查找
迭代
class Solution {
public int search(int[] nums, int target) {
int low = 0, high = nums.length - 1;
while(low <= high) {
int mid = (low + high) >> 1;
if(nums[mid] == target) return mid;
if(nums[mid] < target) {
low = mid + 1;
continue;
}
if(nums[mid] > target) {
high = mid - 1;
continue;
}
}
return -1;
}
}
递归
class Solution {
public int search(int[] nums, int target) {
int low = 0, high = nums.length - 1;
return binarySearch(nums, target, low, high);
}
private int binarySearch(int[] nums, int target, int low , int high) {
if(low > high) return -1;
int mid = low + ((high - low) >> 1);
if(nums[mid] == target) return mid;
if(nums[mid] > target) return binarySearch(nums, target, low, mid - 1);
if(nums[mid] < target) return binarySearch(nums, target, mid + 1, high);
return -1;
}
}
元素重复的二分查找
public static int search(int[] nums, int target) {
if(nums == null || nums.length == 0) {
return -1;
}
int left = 0;
int right = nums.length - 1;
while(left <= right) {
int mid = left + ((right - left) >> 1);
if(nums[mid] < target) {
left = mid + 1;
} else if(nums[mid] > target) {
right = mid - 1;
} else {
while(mid != 0 && nums[mid] == target)
mid--;
if(mid == 0 && nums[mid] == target) {
return mid;
}
return mid + 1;
}
}
return -1;
}