此为历史版本和 IPFS 入口查阅区,回到作品页
為自己Coding
IPFS 指纹 这是什么

作品指纹

LeetCode筆記 - Binary Search方法 - LeetCode第278題 -First Bad Version 解題筆記

為自己Coding
·
·


Github連結


攝影師:Trace Hudson,連結:Pexels




1. 題目




題目說明: 您是一位產品經理,負責領導團隊開發新的產品,然而最後一版的產品沒有通過品質檢測,每個新的版本是基於上一個版本開發而來的,所以當這個版本的品質是差的,下一個版本也會是不好的

假如我們有n個版本 [1,2, ... n],我們需要找到第一個不好的版,因為從它開始導致後面的版本品質都不好

你將給予一個 API bool isBadVersion(version),它將回傳版本是不是不好的,並實作一個函數來找到源頭(第一個不好的版本),我們將盡量簡化調用API的數量



2. 實作


一樣設定兩個邊界low, up,分別為第一個元素,和最後一個元素,找尋middle值,但這次不能因為middle是不好的版本,就回傳middle的索引,因為它有可能是繼承了上一個不好的版本,所以要往上找:

當middle等於bad version:

  • 如果middle就是第一個元素: 直接回傳middle
  • 如果middle - 1 不是bad version: 就直接回傳middle
  • 找尋範圍應該為: 1(由於是從第一版開始,所以起始位置是1) ~ mid (為什麼不是middle - 1,因為middle有可能就是第一個不好的版本)
  • 但前面已經有設定檢查middle - 1是不是bad version,所以會將up調整為mid - 1,不需要原本的middle元素

當middle不是bad version:

  • 調整找尋範圍: mid + 1 ~ up

如果都沒有版本壞掉,回傳None




程式實作

isBadVersion API是由LeetCode團隊已經提供給我們的

# The isBadVersion API is already defined for you.
# @param version, an integer
# @return an integer
# def isBadVersion(version):
​
class Solution:
  def firstBadVersion(self, n):
    """
   :type n: int
   :rtype: int
   """
    ## 第一版到第n版
    low, up = 1, n
    
    ## 當low小於up也就是沒有交叉,正常的情況下
    while low <= up:
      middle = (low + up) // 2
      
      ## 當middle是bad version
      if isBadVersion(middle):
      
        ## 如果middle就是第一版或是middle前面一個版本不是bad version,就直接回傳middle
        if middle == 1 or not isBadVersion(middle - 1):
          return middle
​
        ## 如果middle是bad version,就要看它之前的版本
        up = middle - 1
      
      ## 當middle不是bad version
      else:
        low = middle + 1
        
    
    
    ## 當交叉了,表示裡面根本沒有bad version,就回傳一個None
    return None
CC BY-NC-ND 2.0 授权