LeetCode算法第一天 二分查找

 一、方法

          从B站看到的方法,连着刷了三个题,都遇到了问题,但都过了;

          地址:二分查找为什么总是写错?_哔哩哔哩_bilibili

       

         这个UP主这个方法很巧妙  ,  他和那种比对值得不太一样,它使用了红蓝两种颜色 来不断逼近 这个解所在的分界点 ,  从而不用去考虑 要不要加等号 要不要加一的问题


 二、遇到的问题

 1.

 这一题 直接有这种方法  存在几个问题,

        ①数组中没有要找到的元素 要返回-1   这个要进行判断;

        ②数组中元素只有一个  因为 l的初始下标为一 导致数组越界问题 

        ③符合条件的数字恰好在端点处,如:在【2,5】中寻找≤5的数字,最终l=1,r=2,r不移动(这个我还没有太理解  具体题目遇到了在分析 )

                

class Solution {
    public int search(int[] nums, int target) {
        int l=-1;
        int r=nums.length;
        while((l+1)!=r){
            int mid=l+(r-l)/2;
            if(nums[mid]<=target){
                l=mid;
            } else{
                r=mid;
            }
        }
        if(l==-1) return -1;
        else{
            if(nums[l]==target) return l;
            else return -1;
        }
    }
}


2.

 这道题坑死我了  直接死循环 ,  他给的数据 超出了 int范围 2147483647+1=-21474883648 我烂掉了  别的方法应该不需要转换  但这种方法 必须转成Long  因为他的范围需要加一 正好超出范围!

/* The isBadVersion API is defined in the parent class VersionControl.
      boolean isBadVersion(int version); */

public class Solution extends VersionControl {
    public int firstBadVersion(int n) {
            long l=0;
            long r=(long)n+1;
            while(l+1!=r){
                long mid=l+(r-l)/2;
                if(!isBadVersion((int)mid)){
                    l=mid;
                   
                }
                else{
                    r=mid;
                  
                }

            }
            return (int)r;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值