题解 | #二分查找-II#
二分查找-II
http://www.nowcoder.com/practice/4f470d1d3b734f8aaf2afb014185b395
描述
请实现有重复数字的升序数组的二分查找
给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的target,如果目标值存在返回下标,否则返回 -1
示例1
输入: [1,2,4,4,5],4 返回值: 2
说明:
从左到右,查找到第1个为4的,下标为2,返回2
示例2
输入: [1,2,4,4,5],3 复制 返回值: -1
示例3
输入: [1,1,1,1,1],1 返回值: 0
解题:
按照一般的思路,确定一个区间然后再根据整个数组的中间值去改变区间起始位置,然后在最小区间获得目标值的下标
int index=-1;
int length=nums.length;
int min=length/2;
int end=length-1;
int start=0;
while ((end-start)>2){
if(target<=nums[min]){
end=min;
min=min/2;
}
if(target>nums[min]){
start=min;
min=((end-min+1)/2)+min;
}
}
for (int i = start; i <=end; i++) {
if(target==nums[i]){
return i;
}
}
return index;算法优化之后的代码
int index=-1;
int length=nums.length;
int mid=length/2;
int end=length-1;
int start=0;
while (end>start){
if(target<nums[mid]){
end=mid;
mid=mid/2;
}
if(target>nums[mid]){
start=mid;
mid=((end-mid+1)/2)+mid;
}
if(target==nums[mid]){
while (mid!=0&&nums[mid]==nums[mid-1])
mid--;
return mid;
}
}
return index;