【问题标题】:Algorithm - Smallest subtraction算法 - 最小减法
【发布时间】:2016-06-05 21:21:18
【问题描述】:

我们得到了整数的列表/数组(我们可以同时使用)
一步,我们可以减去其中两个并放入列表/数组
做这个操作我们能得​​到的最小数字(或相同数字)是多少( > 0 )

f.e 我们有 6 4 2
第一步取 6 和 4,我们得到 2 和 2,所以 anwser 是 2

1 7 5
取 7 和 5,我们得到 2 和 1,然后我们得到 1

8 20 4 15
取 20 和 15,我们得到 8 5 4,取 8 和 5,我们得到 4 和 3,然后我们得到 1

我可以在时间 T(n) = n^n 内做到这一点,通过比较所有内容或对每一轮进行排序,我们如何才能更快地做到这一点?

【问题讨论】:

  • 如果列表已经排序,你不能采取一种贪婪的方法,从列表的末尾开始,然后减去左边的那个,然后重新插入并继续这样做吗?
  • 到目前为止你尝试过什么?我们不会为你做作业。请阅读stackoverflow.com/help/how-to-ask
  • 好的,所以我的第一次尝试是将所有内容与所有内容进行比较比我考虑排序列表/数组和使用优先级队列,只需添加减法(它不起作用)我在想集合,我们总是取 2 个最大的并把它,当集合的最大值等于集合的最小值时,我们可能会结束,但是我认为最后一个不起作用 Greey 方法可能不起作用我我们无法对每个列表/数组进行排序移动
  • 我又尝试了一些方法,并相应地更新了我的答案,但我认为你最好的办法就是找到最大的数字,然后在每个步骤中从中减去所有其他数字。跨度>

标签: arrays algorithm list math time


【解决方案1】:

在解决过类似问题后,我确信没有贪心算法可以保证最佳结果。但是,可能没有必要在每个步骤中查看两个数字的每一个组合。

看几个例子,很明显,您使用的第一个数字应该始终是最大的。对于 3 或 4 个元素的列表,减去第二大数字始终是最佳选择。但是,对于 5 个或更多元素的列表,似乎没有一般规则。

10,4,3,2,1  ->  6,3,2,1  ->  3,2,1  ->  1,1  ->  1  (largest minus 2nd-largest: 10-6=4)
10,4,3,2,1  ->  9,4,3,2  ->  5,3,2  ->  2,2  ->  2  (largest minus smallest: 10-1=9)
 9,8,7,6,5  ->  1,7,6,5  ->  1,1,5  ->  1,4  ->  3  (largest minus 2nd-largest: 9-8=1)
 9,8,7,6,5  ->  4,8,7,6  ->  4,1,6  ->  2,1  ->  1  (largest minus smallest: 9-5=4)

我测试了一个算法,它为每个步骤尝试最小和第二大数字(导致 2n 递归),但发现了一个不起作用的示例:99,78,68,56,52,4,3 .

仅使用最小或第二大的最佳解决方案是 6:

99 78 68 56 52  4  3
96 78 68 56 52  4
92 78 68 56 52
40 78 68 56
40 10    56
   10    16
          6

通过暴力破解所有选项找到的最佳解决方案是 1:

99 78 68 56 52  4  3
31 78    56 52  4  3
31 26    56     4  3
   26    25     4  3
    1           4  3
    1           1

如果您使用最大的数字作为唯一的优化,这将导致以下算法:

  • 找出最大的数
  • 遍历所有其他数,从最大数中减去它,然后递归

与尝试两个数字的每个组合或在每一步之后进行排序相比,这将具有更低的时间复杂度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多