拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 CodilityNailingPlanks-对钉子数使用二进制搜索而不是木板

CodilityNailingPlanks-对钉子数使用二进制搜索而不是木板

白鹭 - 2022-02-28 2095 0 0

我已经阅读了关于这个问题的答案 - 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 中的第一个钉子:

  1. 首先它计算这个范围内的钉子可以覆写的最小和最大值(min_covermax_cover)。
  2. 接下来,它查看 A 和 B,并检查每个木板是否可以被范围内的任何钉子钉住(min_cover, max_cover)
  3. 如果结果是False,我们更新min_nailsmid_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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *