假定存在的问题如下:
在火星上生活着一群蠕虫。每个蠕虫都表示为一维数组中的元素。蠕虫决定互相吃东西,但任何蠕虫只能吃最近的邻居。每个蠕虫都有一个预设的能量(即即元素的值)。在火星上,法律规定,当能量为 x 的蠕虫 i 吃另一种能量为 y 的蠕虫时, i 个蠕虫的最终能量变为 xy 。蠕虫被允许具有负能量水平。
找到最后一个蠕虫的能量最大值。
Sample data:
0,-1,-1,-1,-1 has answer 4.
2,1,2,1 has answer 4.
解决此问题的合适逻辑是什么?
答案 0 :(得分:3)
此问题具有非常简单的 O(N)解决方案。
如果数组中的两个成员具有不同的符号,则答案是所有元素的绝对值之和。
要了解原因,请想象一下数组中的单个正值,所有其他元素均为负(示例1)。现在最好的策略是使该值保持正值,并逐渐吞噬所有邻居,以增加该值。正值的位置无关紧要。对于单个否定元素,该策略相同。
在更一般的情况下,如果大小为N
的数组具有不同符号的值,我们总是可以找到大小为N-1
的具有不同符号的数组,因为必须有一对具有不同的符号,我们可以将它们组合成我们喜欢的任何符号。
例如使用以下数组:[1,2,-5,4,-10]
[1,2,-5,-14]
[1,-7,-14]
[8,-14]
22
,即所有绝对值的总和。对于所有具有相同符号的值,我们的第一步是产生一个相反的符号,该符号将具有最小“成本”的邻居对组合在一起。直观上,我们不想在此转换上浪费两个大数字。如果我们采用x,y
个邻居对,则组合后(相反符号)的新值将为abs(x-y)
。由于结果只是绝对值的总和,因此我们可以将其解释为-从最大可能的输出中“丢失” abs(x)
和abs(y)
,而改为“获得” abs(x-y)
。因此,使用此对进行符号转换的“成本”为abs(x)+abs(y)-abs(x-y)
。由于我们需要最小化此成本,因此我们选择具有最低此类值的初始阵列邻居对。
因此,如果我们采用上述数组,但现在所有值均为正[1,2,5,4,10]
:
(1,2)
转换为-1的“费用”为1+2-abs(-1)=2
。(2,5)
转换为-3的“费用”为2+5-abs(-3)=4
。(5,4)
转换为-1的“费用”为5+4-abs(-1)=8
。(4,10)
转换为-6的“费用”为4+10-abs(-6)=8
。因此,我们将(1,2)
对转换为-1。然后,将所得数组的绝对值求和即可得到20。请注意,该值比我们前面的示例小2。