二分查找

二分查找

最近做了两道关于算术平方根的题目,用二分查找解决的。但是做题过程中有些细节需要注意!!!

注:二分查找算法仅适用于有序序列,它只能用在升序序列或者降序序列中查找目标元素。

题目如下:

两个题目差不多,一个是返回该数的算术平方根,一个是判断该数是不是完全算术平方根。

第二张图里面,已经标注了并且也是我发现力扣的一个小bug哈哈哈!代码有问题,但是仍然能通过。所以大家平时刷题的时候一定要注意细节,即使是通过了也不一定代表正确。

注意几个问题:

1.代码中如果要使用right=num/2,那么left建议修改为left=1;

2.为什么判断语句if里面使用mid<num/mid(相信很多人第一反应是mid*mid<或>=num),但是这里需要考虑到溢出问题,代码中是int型 如果要使用mid *mid,就需要强制转换类型为long。

3.计算 mid 时也需要防止溢出,代码中 left + (right - left) / 2 就和 (left + right) / 2 的结果相同,但是有效防止了 leftright 太大直接相加导致溢出。 (上图代码中没太注意该细节,嘿嘿)

最后,二分查找方法有两种类型 一个是[left,right](即左右都是闭区间)另一个是[left,right)(左闭右开),两种方法都可以 但是我建议使用第一个[left,right]。个人感觉在细节方面更方便,有时候[left,right)并不能完全满足解题需求,还需要在解题后面打补丁。

例如:整数1是否位于数组a[2]={0,1}里面,如果循环条件是left<right

第一次查找:left=0,right=1,mid=0,a[mid]<1,left=mid+1=1,此时left==right,跳出循环,查找失败,而这个结果和实际情况是不一致的。

[left,right]——mid=left + (left - right)/2,left=mid+1(mid< _ ),right=mid-1 (mid> _ );

[left,right)——mid=left + (left - right)/2,left=mid+1 (mid< _ ),right=mid (mid> _ )(因为右边是开区间,不包括mid只取到mid-1)

posted @ 2022-03-03 20:09  贝贝子  阅读(300)  评论(0编辑  收藏  举报