目录
首先我们的前提是数组arr是有序的,选取中间的数mid,与target作比较,可以筛选掉一半的数据,然后再选取mid与target作比较,重复此操作直至找到target。
这种操作时间复杂度为,还是蛮低的。
接下来我们要看两种写法:闭区间[l, r] 和 左闭右开区间[l, r)。
写法1:闭区间[l, r]
// 寻找 target 在数组的下标
int find(int[] arr, int target){
int l = 0;
int r = arr.length - 1;//减1的话最后一个元素才有意义,不减的话就没意义了,就要对应左闭右开的写法
// l == r 区间只剩下一个元素,是有意义的
while(l <= r){//可能是咱们要找的元素,还是能查找的,就是<=
//int mid = (l + r) /2;// 存在数值溢出
int mid = l + (r - l) / 2;
if(arr[mid] > target){
r = mid - 1;.// 更新我们的r,不能取mid,因为mid不可能是我们要找的数,所以要减1
}
else if(arr[mid] < target){
l = mid + 1;
} else {
return mid;
}
}
}
写法2:左闭右开[l, r)
//左闭右开中的r不是我们要找的一个数,就是一个辅助而已。
// 寻找 target 在数组的下标
int find(int[] arr, int target){
int l = 0;
int r = arr.length;//最右边的数是没意义的,所以不用减1
// l == r无意义,也就是区间只剩一个元素是无意义的
while(l < r){//就没等于号了
int mid = l + (r - l) /2;//不存在数值溢出的可能
if(arr[mid] > target){
r = mid;// 不能 r = mid - 1,因为r是不可能成为我们的目标数的
}
else if(arr[mid] < target){
l = mid + 1;
}else {
return mid;
}
}
}
往后做题推荐选用闭区间的做法。