题目描述:请实现有重复数字的升序数组的二分查找
给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1
主要思路:确定一个start和end值 分别是二分查找的左右边界,mid是二者的平均数。通过比较mid下标的值和target来确定下一次选取的边界值。改数组为升序!!!
当mid下标值小于target时,说明结果在右边则将start变为mid+1,end不变;
当mid下标值大于target时,说明结果在左边则将end变为end+1,start不变;
当mid下标的值等于target时,说明找到结果但没有完全找到,需要判断此时的mid之前是否还有targe值。
通过上一轮的结果得到,该轮的start-1一定不是target,则需要找到第一个target的范围就是[start,mid](start和mid为当前值),之后依次遍历该范围,确保找到第一个target值得下标。
import java.util.*;
public class Solution {
public int search (int[] nums, int target) {
// write code here
int len = nums.length;
if(nums == null||len==0){ //若数组空则直接-1
return -1;
}
int start = 0; //start和last分别是二分法的左右值
int end = len;
while(start<end){
int mid = (start+end)/2;
if(nums[mid]<target){
start = mid+1;
}else if(nums[mid]>target){
end = mid-1;
}else{
end = mid;
}
}
for(int i=start;i<=end;i++){
if(nums[i] == target){
return i;
}
}
return -1;
}
}