这实际上不是一项作业,而是一种练习和优化,但这似乎是此类问题的最佳部分。
这是一个动态编程问题,内容如下:
-给出N个元素的未排序数组,从中选择K个元素,以使它们的绝对差最大。
在此计算相邻元素之间的绝对差。因此,如果我们有一个由5个元素组成的数组:1 5 3 2 1,且k = 3,则绝对差为:
1 5 3 = | 5-1 | + | 3-5 | = 6
1 5 2 = | 5-1 | + | 2-5 | = 7
1 5 1 = [5-1 | + | 1-5 | = 8
等
1 5 1最大,需要1 8 1
到目前为止,我一直在尝试通过找到K个数字的所有可能组合并递归然后返回最大(蛮力)来解决这个问题。
这显示了一个可怕的想法,因为例如当尝试使用N = 50和k = 25的数组时,存在1.264106064E + 14个组合。
我使用的递归是一种简单的递归,用于从数组中打印所有K位整数,而不是打印它们,而是将它们保存在数组中:
static void solve(int[] numbers,int k,int startPosition,int[] result) {
if (k == 0) {
System.out.println(absoluteDifferenceSum(result));
return;
}
for (int i = startPosition; i <= numbers.length - k; i++) {
result[result.length - k] = numbers[i];
solve(numbers,k - 1,i + 1,result);
}
}
我想要实现的是最佳复杂度(我想这里不能低于O(n ^ 2),但是我没有主意,也不知道如何开始。对您有所帮助!