预处理
给定一个数组要搜索目标值,返回目标值的位置(下标)。如果数组是无序的,那么就要做排序预处理。
二分搜索模板一
public int binarySearch(int[] nums,int target){
if(nums==null){
return -1;
}
int left=0,right=nums.length-1;
while(left<=right){
int mid=left+(right-left)/2;//防止left+right溢出
if(nums[mid]==target){
return mid;
}else if(nums[mid]<target){
left=mid+1;
}else{
right=mid-1;
}
}
return -1;
}
关键
1.循环条件:left <= right
2.right索引赋值:right = mid-1
二分搜索模板二
public int binarySearch(int[] nums,int target){
if(nums==null){
return -1;
}
int left=0,right=nums.length;
while(left<right){
int mid=left+(right-left)/2;//防止left+right溢出
/*if(nums[mid]==target){
return mid;
}else*/ if(nums[mid]<target){
left=mid+1;
}else{
right=mid;
}
}
if(left<nums.length&&nums[left]==target){
return left;
}
return -1;
}
关键
1.循环条件:left < right
2.right索引赋值:right = mid
3.后处理:当left == right时,循环结束,需要判断left索引是否是数组的下标以及该下标的元素是否是目标值来决定是否找到目标值的位置(下标)。
二分搜索模板三
public int binarySearch(int[] nums,int target){
if(nums==null){
return -1;
}
int left=0,right=nums.length-1;
while(left+1<right){
int mid=left+(right-left)/2;//防止left+right溢出
if(nums[mid]==target){
return mid;
}else if(nums[mid]<target){
left=mid;
}else{
right=mid;
}
}
if(nums[left]==target){
return left;
}
if(nums[right]==target){
return right;
}
return -1;
}
关键
1.循环条件:left + 1 < right
2.left、right索引赋值:left = mid , right = mid
3.后处理:当left + 1 == right时,循环结束。需要判断left索引对应的元素是否为目标值,若是,则返回left;同理对right索引进行同样的判断处理。
使用二分搜索的关键
可以对返回值可能出现的范围作为下标构建一个排好序的数组,然后在该数组进行二分搜索。