例:在一个升序的数组中,查找target。
①确定查找范围,设置i = 0;j = n - 1;
②然后折半,(i + j)/2,判断该索引位置的值与目标值大小
③若是相等则就找到了,大的话目标值就在左半段,小的则在有半段。
④直至( j < i )还没找到target,则没有。
例:假如,该数组有多个target,我想要位置最左边的那个。
public static int binarySearch(int[] a,int target){
int i = 0,j = a.length - 1;
int candidate = -1;
while(i <= j){
int m = (i + j) >>> 1;
if(terget < a[m]){
j = m - 1;
}else if(a[m] < target){
i = m + 1;
}else {
candidate = m;
j = m - 1;
}
}
return candidate;
}
二分查找最左边的那个值。
如果只要普通二分查找将candidate变量删去,target == a[m] 时,直接返回索引。
当然,知道了二分查找找最左边那个值,要是我想找左右边的那个值呢,将第二个else语句的j = m - 1,换成j = m + 1即可。
题:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为?
O(log n)
?的算法。
public int searchInsert(int[] nums, int target) {
int i = 0,j = nums.length - 1;
while(i <= j){
int m = (i + j) >>> 1;
if(target < nums[m]){
j = m - 1;
}else if(nums[m] < target){
i = m + 1;
}else {
return m;
}
}
return i;
}