二分查找算法详解(附代码)
注:现有一个升序 不重复的数组 查询target是否在此数组中并返回序号
使用二分算法的两个条件:
有序
不重复
混淆处
二分算法两种方式容易弄混淆的地方:就是对区间的定义
左闭右闭区间 [left,right]
左闭右开区间 [left,right)
也就是在写while (left < right) 语句时 不清楚中间的判断符号咋写 是< 还是 <=
还有在循环中的if (nums[mid] > target) {right = mid;}语句中 符号的判断段 还有right = mid 还是right = mid-1
mid代表数组的中间序号 target是你查询的目标值
左闭右闭
先说第一种写法;左闭右闭
左闭右闭就是对区间的判断 可以取到两边的值 [left,right]
在取值的时候右边要取到数组长度-1 的值 int right = nums.length - 1;
写while 时,就多一种 left=right 的可能 所以需要用 <= 来确定
if语句判断 :if (nums[mid] > target) {right = mid-1;} 因为你可以取到 right的值而且时候判断出mid的值不是我们想要的,是比我们目标值大,所以要动右区间把最右边的值取到mid-1处;
代码如下:
int left = 0; int right = nums.length - 1; while (left <= right) { int mid = left + ((right - left) / 2); if (nums[mid] > target) { right = mid - 1; } else if (nums[mid] < target) { left = mid + 1; } else if (nums[mid] == target){ return mid; } } return -1;
左闭右开区
左边的不变 主要是右边发生变化
右边的值现在取不到 int right = nums.length ;
while语句就没有left=right 的可能性
if语句:if (nums[mid] > target) {right = mid;} 因为right是取不到的 所以 mid=right是有意义的
代码如下:
nt left = 0; int right = nums.length; while (left < right) { int mid = left + ((right - left) / 2); if (nums[mid] > target) { right = mid; } else if (nums[mid] < target) { left = mid+1; } else if (nums[mid] == target) { return mid; } } return -1;
————————————————
版权声明:本文为CSDN博主「阿杰么」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_55916987/article/details/125754297