所以我有一系列双打。我想在这个大小为k的数组中找到一个子集,并将不在子集中的所有子集存储到不同的子数组中。我希望为所有可能的子集执行此操作,而不重复。
最好的方法是什么?
double[] sample = {
1.0, 3.0, 1.6, 2.1, 2.5, 2.7, 2.3, 1.5, 1.1, 0.5, 2.0, 2.0, 1.2, 1.2, 1.3, 0.5, 1.4, 2.4
};
public static void main(String[] args) {
ArrayList < double[] > list = new ArrayList < double[] > ();
double[] noo = pickNRandom(sample);
if (!list.contains(noob)) { //here I want to make sure that it is a unique subset
list.add(noob);
for (double a: noob) {
System.out.print(a + " ");
}
System.out.println("");
}
}
public static double[] pickNRandom(double[] lst) { //finding a random subset
double[] i = lst;
Collections.shuffle(Arrays.asList(i));
double[] fin = {
i[0], i[1], i[2], i[3], i[4], i[5], i[6], i[7]
};
return fin;
}
答案 0 :(得分:0)
我建议采用两种可能的方法来解决这个问题,这是子集和问题的一种变化(在多项式时间内无法解决的NP完全问题)。这两种方法是:
递归方法更容易理解,但动态编程方法更有效,更优雅。我建议您查看this网站,并调整解决方案以适应您的问题(而不是求和,将子集添加到您的子阵列中)。
答案 1 :(得分:0)
这是一种递归方法,用于为给定的整数数组创建所有k个子集的集合:
import java.util.ArrayList;
public class Solution {
public static void ksubsets(int[] arr, int left, int idx,
ArrayList<Integer> curArr, ArrayList<ArrayList<Integer>> result) {
if (left <= 0) {
ArrayList<Integer> tmp = new ArrayList<>(curArr);
result.add(tmp);
return;
}
for (int i = idx; i < arr.length; i++) {
curArr.add(arr[i]);
ksubsets(arr, left - 1, i + 1, curArr, result);
curArr.remove(curArr.size() - 1);
}
}
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4};
int left = 3; // specifies the subset size
int idx = 0;
ArrayList<Integer> curArr = new ArrayList<>();
ArrayList<ArrayList<Integer>> result = new ArrayList<>(); // contains all calculated subsets
Solution.ksubsets(arr, left, idx, curArr, result);
System.out.println(result.size());
}
}
执行方法ksubsets(...)
后,result
包含以下ArrayLists
:
1,2,3
1,2,4
1、3、4
2,3,4
大小4的集合中有大小3的所有不同子集。