我已經閱讀了關于這個問題的答案 - Codility NailingPlanks。這不是重復的,因為我正在嘗試使用不同的方法解決這個問題 - 而不是在給定的釘子可以覆寫的木板上運行二進制搜索,我試圖在所需的釘子總數上運行它覆寫所有的木板。
這是我的代碼:
def solution(A, B, C):
min_nails = 1
max_nails = len(C)
valid = []
while (min_nails <= max_nails):
mid_nails = (min_nails max_nails) // 2
if (is_valid_nails_amount(mid_nails,A,B,C)):
max_nails = mid_nails - 1
valid.append(mid_nails)
else:
min_nails = mid_nails 1
return -1 if len(valid) == 0 else min(valid)
def is_valid_nails_amount(nails,A,B,C):
candidates=C[0:nails]
min_cover = min(candidates)
max_cover = max(candidates)
isValid = True
for (a,b) in zip(A,B):
if not(min_cover in range(a, b 1) or max_cover in range(a, b 1) or a in range(min_cover, max_cover 1) or b in range(min_cover, max_cover 1)):
isValid = False
break
return isValid
該演算法首先檢查len(C) 1 / 2C 中的第一個釘子:
- 首先它計算這個范圍內的釘子可以覆寫的最小和最大值(
min_cover和max_cover)。 - 接下來,它查看 A 和 B,并檢查每個木板是否可以被范圍內的任何釘子釘住
(min_cover, max_cover)。 - 如果結果是
False,我們更新min_nails為mid_nails 1并重復。如果結果是True,我們存盤在釘子的數量valid排列,并試圖發現指甲量較小,其也將作業,通過設定max_nails = mid_nails - 1
這種方法得分100%的正確,在性能測驗中卻失敗,因為它會產生不正確的結果-為每個性能測驗,指甲的最小數目獲得比預期的結果要低得多。我懷疑錯誤會在這一行:if not(min_cover in range(a, b 1) or max_cover in range(a, b 1) or a in range(min_cover, max_cover 1) or b in range(min_cover, max_cover 1))
但我無法弄清楚它是什么。
uj5u.com熱心網友回復:
if使用此示例輸入可以看到您的條件問題:
A = [1,3,5]
B = [2,4,6]
C = [1,5,3]
print(solution(A, B, C))
這將列印 2,但預期輸出為 3,因為需要所有三個釘子。
然而,您的代碼將有is_valid_nails_amount(2, A, B, C)return True,盡管第二塊木板沒有被這兩個釘子釘住。
問題是這些條件都不能保證釘子會碰到木板(a, b):
a in range(min_cover, max_cover 1)
b in range(min_cover, max_cover 1)
您的演算法確實需要檢查該最小/最大范圍內是否有可用于擊打木板的釘子。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/401797.html
上一篇:如何在ListTileflutter中添加陰影,如“海拔”
下一篇:兩個字串的最大公共連接子串串列
