给定一个排序的整数数组(升序)和一个要查找的整数target
,用O(logn)
的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1
。
样例
在数组 [1, 2, 3, 3, 4, 5, 10]
中二分查找3
,返回2
。
挑战
如果数组中的整数个数超过了2^32,你的算法是否会出错?
思路:刚开始只是简单的写了一个 没有可考虑到可能有重复的值
错误代码:适用于没有重复的数组
public static int binarySearch(int[] nums, int target)
// {
// if(nums.length==0)
// return -1;
// if(nums.length==1)
// return 0;
// int star =0;
// int end = nums.length;
// int mid ;
// int find = 0;
// int result=0;
// while(star!=end)
// {
// mid = (star+end);
// if(nums[mid]==target)
// {
// result = mid;
// find =1;
// break;
// }
// else if(target>nums[mid])
// {
// star = mid;
// end = end;
// }
// else
// {
// star = star;
// end = mid;
// }
// }
// if(find==0)
// return -1;
// else
// return result;
//
正确代码:public static int binarySearch(int[] nums,int target)
{
if(nums.length==0) {
return -1;
}
int start=0,end= nums.length-1;
while(start+1<end) {
int mid = start+(end-start)/2;
if(nums[mid]==target) {
end=mid;
}else if(nums[mid]<target)
{
start =mid;
}
else {
end = mid;
}
}
if(nums[start]==target) {
return start;
}
if(nums[end]==target) {
return end;
}
return -1;
}
另外还可以采用递归的方式