【LeetCode通关全记录】278. 第一个错误的版本

【LeetCode通关全记录】278. 第一个错误的版本

题目地址:278. 第一个错误的版本

解法:二分查找

这道题虽然看起来很绕,但本质上就是个简单的二分查找变体而已。因为这题要求的是第一个错误的版本,所以在判断错误版本时要让r = m,并且判断条件要改成l < r,这样最后会在l == r时退出循环,此时返回的r就是第一个错误版本。

通过这题学到一招:在二分查找中,使用公式l + (r - l) / 2来求m可以避免溢出的问题。

这里给出两种写法:

  1. 手写二分查找
/** 
 * Forward declaration of isBadVersion API.
 * @param   version   your guess about first bad version
 * @return            true if current version is bad 
 *                    false if current version is good
 * func isBadVersion(version int) bool;
 */

func firstBadVersion(n int) int {
    l, r := 1, n
    for l < r {
        m := l + (r - l) / 2
        if isBadVersion(m) {
            r = m
        } else {
            l = m + 1
        }
    }
    return r
}

执行用时: 0 ms(超过100%的Golang提交记录)

内存消耗: 1.9 MB(超过100%的Golang提交记录)

时间复杂度:O(logn),二分查找的时间复杂度为O(logn);

空间复杂度:O(1),只使用了常数个数的存储空间。

  1. 使用sort.Search()函数
/** 
 * Forward declaration of isBadVersion API.
 * @param   version   your guess about first bad version
 * @return            true if current version is bad 
 *                    false if current version is good
 * func isBadVersion(version int) bool;
 */

func firstBadVersion(n int) int {
    return sort.Search(n, func(i int) bool {
        return isBadVersion(i)
    })
}

执行用时: 0 ms(超过100%的Golang提交记录)

内存消耗: 1.9 MB(超过100%的Golang提交记录)

时间复杂度:O(logn),二分查找的时间复杂度为O(logn);

空间复杂度:O(1),只使用了常数个数的存储空间。

你可能感兴趣的:(【LeetCode通关全记录】278. 第一个错误的版本)