力扣:探索初级算法——排序和搜索篇----第一个错误的版本---详细题解

题目

在这里插入图片描述官方题解
其他人的思路

代码

C语言:

// The API isBadVersion is defined for you.
// bool isBadVersion(int version);

int firstBadVersion(int n) {
    int left = 1;
    int right = n;
    while (left <=right)
    {
        int mid = left + (right-left)/2;    //在二分查找中,选取 \mathrm{mid}mid 的方法一般为 mid=1/2(left+right),如果使用的编程语言会有整数溢出的情况(例如 C++,Java),所以用此句代码代替。

        if(isBadVersion(mid)) //申清题意,true表示出错!!!
        {
            right = mid-1;     //范围缩小到mid左边部分
        }
        else       
        {
            left  = mid+1;      //没出错则范围缩小到mid右边部分
        }
    }
    return left;//最后当left=mid时,mid值当left<=right
} 

用到的核心方法

二分查找法

代码分析(收获):

1.举例分析如下:在这里插入图片描述
2.while (left <= right):
循环结束的条件,当left==right的时候,说明范围已经缩减到了最后一个能够寻找的值,不管有没有找到,结束了这次循环之后,整个搜索都应该结束(因为left>right没有意义了)

3.为什么要用二分法:(参考链接:https://leetcode-cn.com/problems/first-bad-version/solution/wei-shi-yao-yong-er-fen-fa-by-vailing/)
此题本质就是在一个有序数组中 寻找 某个符合我们条件的 ,搜索的方法有很多,但是对于在有序数组中,最有效的就是二分搜索法,二分搜索法就是我们不断找数组中点来进行比较。同时对于此题与实际的二分搜索法有所区别的是我们找到版本错误的不能马上返回,因为我们找的是第一个出现错误的,所以我们不能保证前面没有出现错误的,所以找到出现错误的以后我们就应该去掉后面的一半(找第一个出现错误的版本,后面没有用),如果找到的是没有出现错误的,那么出现错误的一定在后面所以要舍去前面一半。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值