Java 如何从大小为n的数组中创建大小为k的所有可能子集(无重复)?
所以我有一系列的双打。我想在这个大小为k的数组中找到一个子集,并将所有不在该子集中的子数组存储到不同的子数组中。我想对所有可能的子集都这样做,不要重复 最好的方法是什么Java 如何从大小为n的数组中创建大小为k的所有可能子集(无重复)?,java,permutation,Java,Permutation,所以我有一系列的双打。我想在这个大小为k的数组中找到一个子集,并将所有不在该子集中的子数组存储到不同的子数组中。我想对所有可能的子集都这样做,不要重复 最好的方法是什么 double[]样本={ 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 }; 公共静态void main(字符串[]args){ ArrayListlist=新的ArrayList(); doub
double[]样本={
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
};
公共静态void main(字符串[]args){
ArrayListlist=新的ArrayList();
double[]noo=选取随机数(样本);
如果(!list.contains(noob)){//这里我想确保它是唯一的子集
添加(noob);
对于(双a:noob){
系统输出打印(a+“”);
}
System.out.println(“”);
}
}
公共静态double[]pickNRandom(double[]lst){//查找随机子集
双[]i=lst;
Collections.shuffle(Arrays.asList(i));
双[]鳍={
i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7]
};
回流翅片;
}
我推荐两种可能的方法来解决这个问题,这是子集和问题(一个无法在多项式时间内解决的NP完全问题)的一种变体。这两种方法是:
- 救援
- 动态规划
递归方法更容易理解,但动态规划方法更高效、更优雅。我建议查看站点,调整解决方案以适应您的问题(而不是求和,将子集添加到子数组中)。以下是一种递归方法,用于为给定整数数组创建一组所有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());
}
}
import java.util.ArrayList;
公共类解决方案{
公共静态无效k子集(int[]arr,int left,int idx,
ArrayList(ArrayList结果){
如果(左)到目前为止,您尝试了什么方法?以下是一个很好的起点: