我们给出了整数的列表/数组(我们可以使用两者) 在一个动作中,我们可以减去其中两个并放入列表/数组中 我们可以执行此操作的最低数字(或相同的数字)(> 0)
f.e我们有6 4 2
先移动Take 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中做到这一点,通过比较所有内容或排序每一回合,我们如何更快地做到这一点?
答案 0 :(得分: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)
我测试了一个算法,该算法尝试每个步骤的最小和第二大数字(导致2 n 递归),但是找到了一个不起作用的示例:{{1 }}。
仅使用最小或第二大的最佳解决方案是6:
99,78,68,56,52,4,3
通过强制所有选项找到的最佳解决方案是1:
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
如果您使用最大数字作为唯一优化,则会产生以下算法:
这比尝试两个数字的每个组合或者在每个步骤之后进行排序具有更低的时间复杂度。