首先找到解决这个问题的连续子数组,或者尽可能接近连续的子数组。如果宽度为奇数,则其中心将是目标/宽度,如果宽度为偶数,则其中心将是(target-1)/width,(target+1)/width。
找到中心后,在两侧添加相同数量的邻居,直到达到所需的宽度。在没有连续解决方案的情况下,数组的最右元素需要向右移动更远。
Ruby code:
def f(target, width)
arr = []
if width % 2 == 0
arr.append target / width
arr.append target / width + 1
else
arr.append target/width
end
while arr.length < width
arr.unshift(arr[0] - 1)
arr.append(arr[-1] + 1)
end
arr[-1] += target - arr.sum
return arr
end
Example run:
> f(12342, 7)
=> [1760, 1761, 1762, 1763, 1764, 1765, 1767]
请注意,此代码不执行任何确认解存在于范围(1,2000)内的工作,但您的代码应该执行此操作。
到目前为止,速度很快,但是找到解决方案的所有子集将会很慢,因为有很多。您可以通过将元素向左和向右推动来找到它们。成对出现。
最终答案将是i的总和:(将元素向左推动累积i个空格的方法数)(将元素向右推动累积i个空格的方法数)。
举个简单的例子:对于目标13,宽度为3,我们从[3,4,6]开始。
pushes: arrays
0: [3, 4, 6]
1: [2, 4, 7], [2, 5, 6]
2: [1, 4, 8], [1, 5, 7], [2, 3, 8]
3: [1, 3, 9]
4: [1, 2, 10]
...然后我们就完成了。这将会有大量的操作,我认为当数组的宽度是范围宽度的一半,并且初始数组位于范围中心时,操作数量会达到峰值。