靈感來源?
- 保持更新,努力學習
- python腳本學習
第一個錯誤的版本
解題思路
- 初始化左右邊界:左邊界?
left = 1
,右邊界?right = n
。 - 二分查找循環:
- 計算中間版本號?
mid
。 - 若?
mid
?是錯誤版本,說明第一個錯誤版本在?[left, mid]
?中,更新右邊界。 - 若?
mid
?不是錯誤版本,說明第一個錯誤版本在?[mid+1, right]
?中,更新左邊界。
- 計算中間版本號?
- 終止條件:當?
left
?和?right
?相遇時,即為第一個錯誤版本。# The isBadVersion API is already defined for you. # @param version, an integer # @return a bool # def isBadVersion(version):class Solution:def firstBadVersion(self, n):""":type n: int:rtype: int"""left, right = 1, nwhile left < right:mid = left + (right - left) // 2 # 防止整數溢出if isBadVersion(mid):# 第一個錯誤版本在[left, mid]中right = midelse:# 第一個錯誤版本在[mid+1, right]中left = mid + 1# 循環結束時,left和right指向同一個位置return left
逐行解釋
# The isBadVersion API is already defined for you.
# @param version, an integer
# @return a bool
# def isBadVersion(version):class Solution:def firstBadVersion(self, n):""":type n: int:rtype: int"""# 初始化左邊界為第一個版本left = 1# 初始化右邊界為最后一個版本right = n# 循環條件:左邊界嚴格小于右邊界# 當left == right時,循環結束,此時的left即為第一個錯誤版本while left < right:# 計算中間版本號,使用(left + right) // 2可能導致整數溢出# 例如當left和right都接近INT_MAX時,加法會溢出mid = left + (right - left) // 2# 檢查中間版本是否為錯誤版本if isBadVersion(mid):# 如果中間版本是錯誤的,第一個錯誤版本可能是mid或在mid左側# 因此更新右邊界為mid(注意:沒有減1,因為mid可能就是答案)right = midelse:# 如果中間版本不是錯誤的,第一個錯誤版本必然在mid右側# 因此更新左邊界為mid + 1left = mid + 1# 循環結束時,left和right指向同一個位置,即第一個錯誤版本return left