美文网首页
【LeetCode通关全记录】278. 第一个错误的版本

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

作者: NoelleMu | 来源:发表于2021-10-20 21:47 被阅读0次

    【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. 第一个错误的版本

          本文链接:https://www.haomeiwen.com/subject/gwjxaltx.html