已知数组A和其大小n,请返回A的所有非空子集。要求A中元素个数不大于20且互异。各子集内部从大到小排序,子集间字典逆序排序。
测试样例:
[123,456,789]
返回:{[789,456,123],[789,456],[789,123],[789],[456 123],[456],[123]}
import java.util.*; public class Subset { public ArrayList<ArrayList<Integer>> getSubsets(int[] A, int n) { Arrays.sort(A); ArrayList<ArrayList<Integer>> list=new ArrayList<>(); ArrayList<Integer> tmp=new ArrayList<>(); solve(A,A.length-1,list,tmp); Collections.sort(list,new Comparator<ArrayList<Integer>>() { @Override public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) { String s1=o2.toString().replace("[", "").replace("]", ""); String s2=o1.toString().replace("[", "").replace("]", ""); return s1.compareTo(s2); } }); return list; } public static void solve(int[] A,int index,ArrayList<ArrayList<Integer>> list,ArrayList<Integer> tmp) { for(int i=index;i>=0;i--) { tmp.add(A[i]); list.add(new ArrayList<>(tmp)); solve(A,i-1,list,tmp); tmp.remove(tmp.size()-1); } } }
import java.util.*; import java.util.ArrayList; public class Subset { public static ArrayList<ArrayList<Integer>> getSubsets(int[] A, int n) { ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); int m = (int) Math.pow(2, n); for (int i = m - 1; i >=1; --i) { ArrayList<Integer> list = new ArrayList<>(); for (int j = n - 1; j >= 0; --j) { if (((i >> j) & 1) == 1) { list.add(A[j]); } } result.add(list); } return result; } }
// 因为这两个逆序,调了好久。。。 import java.util.*; public class Subset { public ArrayList<ArrayList<Integer>> getSubsets(int[] A, int n) { ArrayList<ArrayList<Integer>> allSubsets = new ArrayList<ArrayList<Integer>>(); int max = 1 << n; Arrays.sort(A); for (int k = 0; k < max; k++) { ArrayList<Integer> subset = convertIntToSet(k, A); if (subset.size() != 0) { allSubsets.add(0, subset); } } return allSubsets; } private ArrayList<Integer> convertIntToSet(int k, int[] A) { ArrayList<Integer> set = new ArrayList<Integer>(); int index = 0; for (int i = k; i > 0; i >>= 1) { if ((i & 1) == 1) { set.add(0, index); } index++; } return set; } }