【发布时间】:2021-06-29 20:25:04
【问题描述】:
这个问题是在一次采访中问我的,我无法想出一个最佳的解决方案。
问题
给定一个偶数大小的数组,我们可以对数组进行任意操作,直到数组变成为空,这样总的成本应该是最低。
操作:
- 删除第一个和最后一个元素 => 成本将是 gcd(first, last)
- 删除第一个和中间元素 => 成本将为 gcd(first, middle)
- 删除中间和最后一个元素 => 成本将是 gcd(middle, last)
注意:
- 在偶数大小的数组中,有两个中间元素。因此,将第二个中间元素视为中间元素。
- gcd(x,y) 代表 x 和 y 之间的Greatest Common Divisor
示例:
输入:[2, 4, 8, 6]
输出:4
解释:
- 在第一个操作中删除第一个和中间元素,cost = gcd(2,8) = 2
- 在第二个操作中删除 4 和 6,cost = gcd(4,6) = 2
- 总成本 = 2+2 = 4
我的方法是比较所有 3 个操作成本,以最低者为准,直到数组为空。而且,这没有用。
【问题讨论】:
-
even 大小数组的 middle 元素是什么?
-
好的,只需要定义。如果两三对的
gcd相等怎么办? -
@YuriGinsburg 您可以选择其中任何一个。除非总成本最低,否则没关系。
-
你的算法在这种情况下使用什么策略?
-
你在描述一个贪心算法。贪心算法很少是最优的。鉴于此输入 {2,1000,1000,5},您能否说服自己您的解决方案是最优的?
标签: arrays algorithm math language-agnostic