leetcode704:二分查找

基本思路:对于给定升序且无重复数组区间,采用二分查找,通过与中位数对比而逐渐缩小区间范围,如果找到直接返回。若未找到,循环条件不满足,退出循环直接返回-1

需要注意的点:

  • 循环条件用<=(左闭右闭)还是<(左闭右开)
  • 左右边界赋值

方法一:区间采用左闭右闭原则

  • 区间判断为left<=right
  • 此时右区间点有效,赋值时为middle-1
class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length-1;
        int middle ;
        while(left<=right){
            middle = (left+right)/2;
         if(nums[middle]>target){
            right = middle-1;
         }else if(nums[middle]<target){
            left = middle+1;
         }else{
            return middle;
         }
    }
    return -1;
   }
}

方法二:区间采用左闭右开原则。

道理如上,只需将右区间点赋值为middle,修改循环的判别条件为left<right即可。

错误思路

  • 为新划分的区间开辟新内存,赋值给数组——浪费内存,且不好计算下标位置
  • 由于新开辟内存,出现在未赋值数组查找元素的情况
  • 由于下标位置是计算的,出现了数组下标越界
  • 对区间划分不清晰,导致跳出循环条件有误,造成答案错误输出

参考答案经验:

  • 在代码中,大概率会出现的条件判断应该放在前,节省时间。针对本题而言,直接判断相等的情况就会比较少,应该放后面
  • 多用已知变量判断,重复调用计算数组长度,会比较浪费时间
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值