LeetCode--278--第一个错误的版本

问题描述:

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

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

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

示例:

给定 n = 5,并且 version = 4 是第一个错误的版本。

调用 isBadVersion(3) -> false
调用 isBadVersion(5) -> true
调用 isBadVersion(4) -> true

所以,4 是第一个错误的版本。 

[F F F F T T T]

 1  2 3 4 5 6 7   N = 7需要返回5    L = 1 R = 7 MID = 4; L = 5 R = 7 MID  = 6 ;L = 5 R = 5 MID = 5;L = 5 R = 4 BREAK;return 5

方法1:折半查找法

 1 class Solution(object):
 2     def firstBadVersion(self, n):
 3         """
 4         :type n: int
 5         :rtype: int
 6         """
 7         left,right = 1,n
 8         while left <= right:
 9             mid = (left + right) // 2
10             if isBadVersion(mid) :
11                 right = mid - 1
12             else:
13                 left = mid + 1
14         return left

改进:

 1 class Solution(object):
 2     def firstBadVersion(self, n):
 3         """
 4         :type n: int
 5         :rtype: int
 6         """
 7         left,right = 1,n
 8         while left <= right:
 9             mid = (left + right) // 2
10             if isBadVersion(mid) :
11                 right = mid - 1
12             else:
13                 if isBadVersion(mid + 1):
14                     return mid + 1
15                 left = mid + 1
16         return left

官方最优:

 1 class Solution(object):
 2     def firstBadVersion(self, n):
 3         """
 4         :type n: int
 5         :rtype: int
 6         """
 7         low = 1
 8         high = n
 9         bad_min = n
10         while low <= high:
11             mid = low + (high - low) // 2
12             if isBadVersion(mid):
13                 bad_min = mid
14                 high = mid - 1
15             else:
16                 if mid + 1 == bad_min:
17                     return bad_min
18                 low = mid + 1      
19         return bad_min

2018-09-23 09:32:14

原文地址:https://www.cnblogs.com/NPC-assange/p/9692017.html