输入为[4,13,14,15,16]
。输出应该是[16,15]
和[14,13,4]
。将数组分成两个子数组,以便数组之和的差值最小?
其中
- 我按降序排列
- 取前两个元素在两个列表
- 现在添加的元素列表中谁和最小的数组进行排序,我能想到以下算法的
public class TestMinDiff {
public static void main(String[] args) {
Integer[] array = {4,13,14,15,16};
Arrays.sort(array, Collections.reverseOrder());
List<Integer> list1 = new ArrayList<Integer>();
List<Integer> list2 = new ArrayList<Integer>();
int list1Sum = 0;
int list2Sum = 0;
for(int i: array) {
if(list1Sum<=list2Sum) {
list1Sum = list1Sum + i;
list1.add(i);
} else {
list2Sum = list2Sum + i;
list2.add(i);
}
}
}
}
输出为
- 列表1为
[16,13,4]
。 - 列表2是
[15,14]
。
看起来像我的算法需要进一步改进。对我来说,它看起来像是一个NP问题。但是我不能想到这里给出的输出为 [16,15]
和[14,13,4]
的算法。
请阅读https://en.wikipedia.org/wiki/Partition_problem。 –