二分查找也叫做折半查找,通俗一点来说就是查找 开始值 和 末尾值 的 中间值,与 目标值 进行比较 直到找到 目标元素 为止。
例题: 给定一个排序数组 nums 和一个目标值 target,在数组中找到目标值,并返回其索引。
输入: nums = [1,4,6,7,9],target = 4
输出: 1
查找思想:
- 如果 中间值 大于 目标值,则中间数字向右的所有数字都大于目标值,全部排除
- 如果 中间值 小于 目标值,则中间数字向左的所有数字都小于目标值,全部排除
- 如果相等,就可以直接返回答案了
应该知道二分法的思路了吧,那我们用图来展示
步骤一,根据初始值(S) 和 末尾值(J) 拿到 中间值(M),用 M 和 目标值(target)进行比较,发现比目标值大,则中间值及右侧值全部删除,末尾值 J 也发生了变化为中间值左边第一个值。
步骤二:已知 S 和 J,需要重新获取 M(根据取整和S相同),用 M 和 target 进行比较,发现比目标值小,则中间值及左侧值全部删除,这时,初始值 M 也发生了变化为中间值右边第一个值。
步骤三:最后可得 S M J都在一个数值上,M 和 target相等,则返回该值的索引即可。
上代码:
public static int binarySearchBasic(int[] nums, int target){
int S = 0, J = a.length - 1; //设置初始值 和 末尾值
while (S <= J){ //S 小于 J 范围内循环,否则跳出循环
int M = (S + J) / 2; //设置中间值
if(target < nums[M]){ //目标在左边
J = M - 1;
}else if(nums[M] < target){ //目标在右边
S = M + 1;
}else{ //找到了,返回索引
return M;
}
}
return -1; //如果没找到那么返回-1
}