[LC][array][Binary Search] 278. First Bad Version

一、问题描述

You are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the quality check. Since each version is developed based on the previous version, all the versions after a bad version are also bad. 

Suppose you have n versions [1, 2, ..., n] and you want to find out the first bad one, which causes all the following ones to be bad.

You are given an API bool isBadVersion(version) which will return whether version is bad. Implement a function to find the first bad version. You should minimize the number of calls to the API.


二、解法

九章上说这个问题可以转化为二分搜索来做。假设暴力搜索,复杂度为O(n),但是过不了。比O(n)更好的基本只有O(logn),每次把问题规模缩小一半。

假设k是第一个bad version,那么记1.....k-1为O, 记k ..... n为X。所以问题变成了求第一个X。套用二分搜索的模版:每次判断中点是什么。如果是O搜后半部分,是X搜前半部分。

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


三、总结与反思

1. 看到暴力是O(n),基本就是要努力把问题转化为二分

2. 二分的各个条件怎么变会怎么样要搞明白(看lecture2笔记)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值