力扣简278 第一个错误的版本

做题思路 考虑要求 尽量减少调用检查接口的次数 所以把这个查找次数尽可能减少

 

因为做的是一个题库里的题 这道题被划分在二分查找里面 其实根本想不到该用二分查找

然后直接套了一套二分查找 结果可能不太对 对于一些形如对搓搓和对错错错的用例会执行错误到mid指向最后一个正确的

 

 

 

 

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

public class Solution extends VersionControl {
    public int firstBadVersion(int n) {
        
        int head=1,tail=n,mid=-1;
        while(head<=tail){
            mid=head+(tail-head)/2;
            if(!isBadVersion(mid)){
                head=mid+1;
            }
            else{
                tail=mid-1;
            }
        }
        if(isBadVersion(mid))
            return mid;
        return mid+1;
    }
}

 

标准答案整体是有思维的 根据题意要求 相当于有序的序列里面找第一个错误的版本

所以整体就是在找错误 不断收敛区间 直到首尾相等 即为错误所在

但是标准答案反而更差 分析因为上面的想法直接mid+-1 收敛更快
    public int firstBadVersion(int n) {
    int head=1,tail=n;
        while(head!=tail) {
            int mid=head+(tail-head)/2;
            if(isBadVersion(mid)) {
                tail=mid;
            }
            else
                head=mid+1;
        }
    return head;
}

 

 

posted @ 2023-02-20 09:41  Ssshiny  阅读(16)  评论(0)    收藏  举报