LeetCode——算法入门——278.第一个错误版本

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

题目

你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。

假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。

你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。

示例

输入:n = 5, bad = 4
输出:4
解释:
调用 isBadVersion(3) -> false 
调用 isBadVersion(5) -> true 
调用 isBadVersion(4) -> true
所以,4 是第一个错误的版本。
复制代码
输入:n = 1, bad = 1
输出:1
复制代码

提示: 1 <= bad <= n <= 2^31 - 1

解题思路

当一个版本为正确版本,则该版本之前的所有版本均为正确版本;当一个版本位错误版本,则该版本之后的所有版本均为错误版本,所有我们可以利用二分查找

  • 定义变量left 表示左边界、middle 表示中间值、right 表示右边界,左右边界初始值分别是[1,n]
  • 当中间值为错误版本说明在前半区间[left,middle]
  • 当中间值为正确版本说明在后半区间[middle+1,right]
  • left = right时,即为答案

代码

解法一

func firstBadVersion(n int) int {
   var left, middle, right int
   left = 1
   right = n
   for left < right { //循环直至区间左右端点相同
        middle = left + (right - left)/2
        if (isBadVersion(middle)){
            right = middle 
        }else{
            left = middle + 1
        }
   }
   return left
}
复制代码

解法二


//go语言sort封装了类似方法直接使用既可
func firstBadVersion(n int) int {
   return sort.Search(n, func(version int) bool {
      return isBadVersion(version)
   })
}
复制代码

复杂度分析

  • 时间复杂度:O(log n),其中 n 是给定版本的数量。
  • 空间复杂度:O(1)。我们只需要常数的空间保存若干变量。

猜你喜欢

转载自juejin.im/post/7017397150258561054