在研究过类似问题后,我确信没有任何贪心算法可以保证最佳结果。然而,可能没有必要在每一步中都查看两个数字的每一个组合。
看几个例子,很明显,您使用的第一个数字应该始终是最大的数字。对于 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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
我测试了一种算法,该算法在每个步骤中尝试最小和第二大的数字(导致 2 n次递归),但发现了一个不起作用的示例: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
Run Code Online (Sandbox Code Playgroud)
通过暴力破解所有选项找到的最佳解决方案是 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
Run Code Online (Sandbox Code Playgroud)
如果您使用最大的数字作为唯一的优化,这将导致以下算法:
这比尝试两个数字的每种组合或在每个步骤后进行排序的时间复杂度更低。