算法最重要的是思路
一年过去了,于2019/09/12再次更新代码
-----------------------------------------------------------------------------------------------------------------------
当元素多次出现在数组中时,基本的二分查找只能返回元素出现的随机位置,代码如下
//二分查找
public static int rank(int key,int[] a) {
//low,high,mid都是数组的索引
int low = 0;
int high = a.length-1;
while(low<=high) {
int mid = (low + high)/2;
if(key<a[mid]) {
high = mid - 1;
}
else if(key>a[mid]){
low = mid+1;
}
else {
return mid;
}
}
return -1;//找不到
}
如果我们想要返回首次出现位置的索引,代码如下
public int binarySearch(int[] nums,int target){
while(low<high){
int mid = low + (high-low)/2;
if(nums[mid]<target){
low = mid+1;
}
else if(nums[mid]==target){
high = mid;
}
else{
high = mid-1;
}
}
if(nums[low]==target) return low;
return -1;//没找到
}
返回最后一次出现的索引的代码同理,如下
public int binarySearch(int[] nums,int target){
while(low<high){
int mid = low + (high-low)/2 + 1;//trick
if(nums[mid]<target){
low = mid+1;
}
else if(nums[mid]==target){
low = mid;
}
else{
high = mid-1;
}
}
if(nums[low]==target) return low;
return -1;
}