先贴代码:
class Solution {
public int search(int[] nums, int target) {
int left = 0 , right = nums.length-1 ; //初始化指针
while (left<=right){ //循环条件是左指针在左边
//这里需要说的是,后面会有right = mid +1 或者 left = mid -1
//执行完这个,就会导致左右指针相对位置错误,就能出循环了
int mid = ( right - left ) / 2 + left; //mid指针计算
int mid_num = nums[mid] ; //为了后续三次,不用每次都取值对比
if(mid_num==target){
return mid; //刚好指到了target
}
else if(target<mid_num) { //目标在左边
right = mid-1; //右指针左移
}
else{ //目标在右边
left = mid +1; //左指针右移
}
}
return -1; //出了循环都没有找到
}
}
在写二分查找的时候,遇到了个很大的问题:
我写的代码,执行超时很严重,当时以为是这个网站出问题了,后来运行了别人写的代码

从这里可以看出,自己和别人还是很大差距的,但我思考不出差距在哪,明明语法上写得都差不多
区别有三点:
1、指针不重合,用while循环进行判断,进循环了才算mid值,可以少算几次
2、最重要的,对于内部数据结构的理解,获取数组mid值
我的做法:每次循环,都是 if (nums[mid]==target) 因为需要比三次,大,小,等,所以就要获取三次结果,就浪费了很多时间
他是会取一次值,mid_num = nums[mid] 然后用mid_num比对三次,省了很多时间
3、在比对完之后,左右指针收缩,我是 left = mid 其实mid值也是不需要的,因为前面已经比对了nums[mid]!=target,指针移动的时候应该多加一位,应该改成 left = mid +1,因此也浪费了时间
4、导致很多用例不通过的区别
我是:while(left!=right) 如果没查到,left会一直比right小1
他是:while(left<=right)
改了这个,通过率一下就从4/47到了47/47
本文探讨了二分查找中的效率瓶颈,通过对比作者和他人代码,揭示了指针操作、数据结构理解、循环条件等优化技巧。提升左移操作和减少不必要的中间值计算,从而大幅提高搜索性能。
1262

被折叠的 条评论
为什么被折叠?



