无重复元素的二分查找
mid=left+righr>>>1;
如果mid>taget,那么说明target在mid的左边,所以right=mid-1;
如果mid<target,那么说明target在mid的右边,所以left=mid+1;
如果mid=target,那么直接返回mid的下标值;
此时循环是可能不进行到结束,就已经返回了。
public static int binarySearch(int[] a, int t){
//l-左边 r-右边 m-中间
int l = 0, r = a.length -1, m;
while (l <= r) {
//m = (l + r) / 2; //l+r结果数值过大会存在溢出
m = (l + r) >>> 1; //正数右移运算相当于除二
if(a[m] == t) {
return m;
}else if (a[m] > t){
r = m - 1;
}else {
l = m + 1;
}
}
return -1;
}
有重复的元素的二分查找
1 找左边界(不断缩小右边界,从而确定最左下标)
mid=left+righr>>>1;(向下取整)
如果mid>taget,那么说明target在mid的左边,所以right=mid-1;
如果mid<target,那么说明target在mid的右边,所以left=mid+1;
如果mid=target,不直接返回target,而是让right=mid
public static int firstPosition(int[] nums, int target){
int left=0;
int right=nums.length-1;
while(left<right){
int mid=(left+right)>>>1;
if(nums[mid]>target){
right=mid-1;
}else if(nums[mid]<target){
left=mid+1;
}else{
right=mid;
}
}
if(nums[left]==target){
return left;
}
return -1;
}
1 找左边界(不断缩小右边界,从而确定最左下标)
mid=(left+righr+1)>>>1;(向上取整)
如果mid>taget,那么说明target在mid的左边,所以right=mid-1;
如果mid<target,那么说明target在mid的右边,所以left=mid+1;
如果mid=target,不直接返回target,而是让letf=mid
public static int lastPosition(int[] nums, int target){
int left=0;
int right=nums.length-1;
while(left<right){
int mid=(left+right+1)>>>1;
if(nums[mid]>target){
right=mid-1;
}else if(nums[mid]<target){
left=mid+1;
}else{
left=mid;
}
}
if(nums[left]==target){
return left;
}
return -1;
}