二分查找:
时间复杂度:O(logn)
条件:二分查找的表为有序表
查询区间:[low,high]
中位数:mid=low+(high-low)/2
终结t条件:low>high,即搜索为空(while(low<=high)),满足终止条件后,返回值直接返回low.二分查找的过程是一个维护low的过程,low从0开始,一直朝着第一个目标逼近,直到到达。
1.元素区间内不存在重复值
代码:
public int binarySearch(int[] nums,int target){
int low=0,high=nums.length-1;
while(low<=high){
int mid=low+(high-low)/2;
if(nums[mid]<target)
low=mid+1;
if(target<nums[mid])
high=mid-1;
if(target==nums[mid])
return mid;
}
return low;
}
2.寻找第一个大于等于target的元素位置
分析:如果存在的话,一定在左边或者是中间
代码:
public int binarySearch(int[] nums,int target){
int low=0,high=nums.length-1;
while(low<=high){
int mid=low+(high-low)/2;
if(nums[mid]<target){
low=mid+1;
}
if(target<=nums[mid]){
high=mid-1;
}
}
return low;
}
3.寻找最后一个大于等于target的元素位置
分析:如果存在的话,一定在右边或者是中间
代码:
public int binarySearch(int[] nums,int target){
int low=0,high=nums.length-1;
while(low<=high){
int mid=low+(high-low)/2;
if(nums[mid]<=target){
low=mid+1;
}
if(target<nums[mid]){
high=mid-1;
}
if(high>=0&&nums[high]==target){
return high;
}
}
return -1;
}
二分查找最后跳出循环while(low<=high)的条件是low>high,且low=high+1。