【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),只使用了常数个数的存储空间。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容