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

来源:互联网 发布:埃摩森猎头公司 知乎 编辑:程序博客网 时间:2024/06/14 15:12

一、问题描述

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笔记)