【发布时间】:2019-11-08 16:26:36
【问题描述】:
这不是真正的作业,而是练习和优化,但这似乎是这类问题的最佳部分。
这是一个动态规划问题,具体如下:
-给定一个由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 是最大的,需要 8 个
到目前为止,我尝试通过递归找到所有可能的 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),但我没有想法,不知道如何开始。感谢任何帮助!
【问题讨论】:
标签: java arrays algorithm dynamic-programming absolute-value