1.二分查找
1.1.循环实现
public int search(int[] nums, int target) {
int low = 0;
int high = nums.length - 1;
while(low <= high){
int mid = low + ((high - low) >> 1);
if(nums[mid] == target) return mid;
else if(nums[mid] > target) high = mid - 1;
else low = mid + 1;
}
return -1;
}
1.2.递归实现
public int search(int[] nums, int target) {
return dfs(nums,target,0,nums.length-1);
}
public int dfs(int[] nums,int target,int low,int high){
if(low <= high){
int mid = low + ((high - low) >> 1);
if(nums[mid] == target) return mid;
else if(nums[mid] > target) return dfs(nums,target,low,mid-1);
else return dfs(nums,target,mid+1,high);
}
return -1;
}
2.二分查找(有重复元素取最左边的元素)
在基本二分查找的基础上,再找到target后,往左边找。
public static int search1(int[] nums, int target) {
if (nums == null || nums.length == 0)
return -1;
int left = 0;
if (nums[0] == target) {
return 0;
}
int right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
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;
}