二分查找算法
思想
二分法:即将一个完整的个体分成两份,即中间取名为mid,左边为left,右边为right。然后将需要查找的数与mid对比,如果大于,则让left=mid,再次从中间取名mid,再次比较,以此往复,直到找完为止,同理需要查找的数小于mid也一样,只不过这次变得是right=mid。
二分法查找有两种形式:
第一种为左闭右闭型,即数值可以从两边判断/获取。
第二种为左闭右开型,即数值只可以从左边判断/获取。最右边的取不到。
第一种
public int search(int[] nums, int target) {
//二分查找
//左闭右闭区间
if(target<nums[0]||target>nums[nums.length-1]){
return -1;//如果target 不在数组范围之内则返回-1 表示没有找到
}
int left = 0,rigth = nums.length-1; // 定义target在左闭右闭的区间里,[left, right]
while (left<=rigth){// 当left==right,区间[left, right]依然有效,所以用 <=
//每次mid为left和right中间位置 即left+(right-left)/2 这里采用位运算
int mid=left+((rigth-left)>>1);// 防止溢出 等同于(left + right)/2
//这里就会有三种情况 等于 大于 小于
if(nums[mid]==target){
return mid;// 数组中找到目标值,直接返回下标
}
if(nums[mid]<target){// target 在右区间,所以[middle + 1, right]
left = mid+1;
}
if(nums[mid]>target){ // target 在左区间,所以[left, middle - 1]
rigth = mid-1;
}
}
//当在范围内没有找到,就返回-1
return -1;
}
第二种
public int search_back(int[] nums, int target) {
//二分查找 左闭右开
if(target<nums[0]||target>nums[nums.length]){
return -1;//如果target 不在数组范围之内则返回-1 表示没有找到
}
int left = 0,right = nums.length;// 定义target在左闭右开的区间里,即:[left, right)
while (left<right){// 因为left == right的时候,在[left, right)是无效的空间,所以使用 <
int mid = left+((right-left)>>1);
if(nums[mid]==target){
return mid;// 数组中找到目标值,直接返回下标
}else if(nums[mid]<target){
left = mid+1; // target 在右区间,在[middle + 1, right)中
}else if(nums[mid]>target){
right = mid; // target 在左区间,在[left, middle)中
}
}
// 未找到目标值
return -1;
}
以上就是两种二分法查找算法。
可以参考力扣第704题进行运用计算。