【Leetcode解題】278. First Bad Version
題目
- 題目連結
- 目標函式 :
firstBadVersion(n)- Input :
n: int - Output :
int
- Input :
解題概念
- 題意 : 題目會給予一 function
isBadVersion(version),會回傳該version是否為 Bad versionversion為1 ~ n- 只要 first bad version 出現,後續 verison 皆為 bad
- 此題須回傳 first bad version 為何
我的寫法
- 想法 : 採用遞迴的方式
- 可以把 Version 表示成
[false, false, false ... true, true.... true] - 因此可以用 Binary Search 的方式去搜尋
- 可以把 Version 表示成
- 程式碼 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16def firstBadVersion(self, n):
left = 1
right = n
if n == 1 : return 1
while left <= right:
mid = (left + right) // 2
if not isBadVersion(mid) : # Version mid 為 false
left = mid + 1 # 往右搜尋
else: # Version mid 為 true
right = mid - 1 # 往左搜尋
return left - 成效 :
- Time Complexity : $\color{DB4D6D}{O(\log(n))}$
- Runtime: 10 ms (faster than 91.45%)
- Memory Usage: 13.3 MB (more than 32.90%)
解答 or 其他優秀寫法
- 想法 : 寫法與我類似,但有學到在取兩數中間值不要使用
mid = (left + right) // 2- 因為
left與right有可能為INT_MAX,兩數會導致 Overflow 的問題發生 - 因此,可改採用
mid = left + (right - left) // 2的寫法
- 因為
- 程式碼 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16def firstBadVersion(self, n):
left = 1
right = n
if n == 1 : return 1
while left <= right:
mid = left + (right - left) // 2
if not isBadVersion(mid) :
left = mid + 1
else:
right = mid - 1
return left - 成效 :
- Runtime: 13 ms (faster than 79.87%)
- Memory Usage: 13.1 MB (more than 95.56%)
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Robin's Tech Blog!


