1st round: 278 First Bad Version

一道让我印象深刻的题

因为让我知道了在binary search中,index的设置:包括初始化,更新条件,的本质意义是什么,对于解题和把握细节的重要作用!

应该可以5min写完


汗!!居然要用long来完成。。。因为要用到mid=(prevGood+currBad)/2,当prevGood和currBad都很大时,加和就overflow int的范围了

public class Solution extends VersionControl {
    public int firstBadVersion(int n) {
/*        long currGood=1;
        long nextBad=n;
        while(currGood<nextBad){
            long mid=(currGood+nextBad)/2;
            if( isBadVersion((int)mid) ) nextBad=mid-1;
            else currGood=mid;
        }
        return (int)(currGood+1);
        
        */ // 上面这个做法,和题意有一点不合,那就是这里面至少有一个bad。。。按照上面的变量命名就可以知道策略,就是currGood要代表这一定是good的,但是1位置不一定是good。。所以不合适!但是下面的设计就是说,currBad=n,是make sense的,因为至少有一个Bad version,所以n肯定是。。。要注意了。。在设计二分法的是前后两个index,一定都是从给定的区间左右极值来的。。否则算法失败!!
       
        long prevGood=1;
        long currBad=n;
        while(prevGood<currBad){
            long mid=(prevGood+currBad)/2;
            if(isBadVersion((int)mid)) currBad=mid;
            else prevGood=mid+1;
        }
        return (int)prevGood; // prevGood==currBad, 这是while循环跳出的条件,所以return 哪个都可以。。。
    }
}





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值