LeetCode学习笔记:二分查找

本文探讨了二分查找中的效率瓶颈,通过对比作者和他人代码,揭示了指针操作、数据结构理解、循环条件等优化技巧。提升左移操作和减少不必要的中间值计算,从而大幅提高搜索性能。

先贴代码:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值