题目描述
请编写一个方法,返回某集合的所有非空子集。
给定一个int数组A和数组的大小int n,请返回A的所有非空子集。保证A的元素个数小于等于20,且元素互异。各子集内部从大到小排序,子集之间字典逆序排序,见样例。
测试样例:
[123,456,789]
返回:{[789,456,123],[789,456],[789,123],[456 123],[789],[456],[123]}
思路:
// P0 = {}
// P1 = 3 {}
// P2 = 3,2 3 2 {}
// P3 = 3,2,1 3,2 3,1 3 2,1 2 1
// 即每循环一轮,相当于在当前项前插入一项比当前项多出A[i]的项, 然后i+=2得到上一轮的下一项
import java.util.*; public class Subset { public ArrayList<ArrayList<Integer>> getSubsets(int[] A, int n) { // write code here ArrayList<ArrayList<Integer>>lists = new ArrayList<>(); if(n<=0)return lists; Arrays.sort(A); for(int i=0;i<n;i++){ for(int j =0;j<=lists.size();j+=2){ ArrayList<Integer> list; if(j<lists.size()){ list =new ArrayList<>(lists.get(j)); } else{ list = new ArrayList<>(); } list.add(A[n-1-i]); lists.add(j, list); } }//for return lists; } }