给定一个int数组A和数组的大小int n,请返回A的所有非空子集。保证A的元素个数小于等于20,且元素互异。各子集内部从大到小排序,子集之间字典逆序排序,见样例。
测试样例:[123,456,789]
注意:由于没有了空集,每次都要单独加入自己。遍历原来的集合(加入自己)。
测试样例:[123,456,789]
* 返回{[789,456,123],[789,456],[789,123],[789],[456 123],[456],[123]}
*/
1.先写一个算法,请返回A的所有子集(包含空集)。
public ArrayList<ArrayList<Integer>> getSubsets(int[] A, int n) {
ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();
Arrays.sort(A);
lists.add(new ArrayList<Integer>());//加入空集。
int index = 0;
while (index < n) {
// 注意:每次加入集合后会改变原来的集合,无法继续从集合中取出元素。
// 必须通过一个中间参数moreSubsets来保存中间结果,最后加入allSubsets。
ArrayList<ArrayList<Integer>> moreSub = new ArrayList<ArrayList<Integer>>();
for (ArrayList<Integer> set : lists) {
ArrayList<Integer> newlist = new ArrayList<Integer>();
newlist.addAll(set);
newlist.add(0,A[index]);
moreSub.add(newlist);
}
lists.addAll(0, moreSub);//按字典顺序逆序输出
//lists.addAll(moreSub);按字典顺序输出
index++;
}
return lists;
}
2.下面介绍:没有空集 且 按字典顺序逆序输出的算法
注意:由于没有了空集,每次都要单独加入自己。遍历原来的集合(加入自己)。
public ArrayList<ArrayList<Integer>> getSubsets2(int[] A, int n) {
ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();
Arrays.sort(A);
int index = 0;
while (index < n) {
//遍历原来的集合(加入自己),再单独加入自己(由于没有了空集)。
//两者没有先后顺序。也可加入自己,再遍历原来的集合
// 注意:每次加入集合后会改变原来的集合,无法继续从集合中取出元素。
// 必须通过一个中间参数moreSubsets来保存中间结果,最后加入allSubsets。
ArrayList<ArrayList<Integer>> moreSub = new ArrayList<ArrayList<Integer>>();
//lists没有元素的话,直接跳过。
for (ArrayList<Integer> set : lists) {
ArrayList<Integer> newlist = new ArrayList<Integer>();
newlist.add(A[index]);
newlist.addAll(set);
moreSub.add(newlist);
}
//加入自己
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(A[index]);
moreSub.add(list);
lists.addAll(0, moreSub);
index++;
}
return lists;
}