我已经阅读了关于这个问题的答案 - 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 / 2
C 中的第一个钉子:
- 首先它计算这个范围内的钉子可以覆写的最小和最大值(
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)
您的算法确实需要检查该最小/最大范围内是否有可用于击打木板的钉子。
0 评论