輸入爲[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。 –