暴力法思路:
遍历数组,当一个元素被选中时,子集就是前面所有的子集加上当前当元素。题目注意点:
1、需要考虑空子集以及只有一个数字的子集情况
2、所有的子集结果需要排序(自定义Comparator实现)PS:解法不唯一,只提供一个简单易理解的思路,如有不对请指正!
参考代码:import java.util.*; public class Solution { public ArrayList<ArrayList<Integer>> subsets(int[] S) { ArrayList<ArrayList<Integer>> reList = new ArrayList<>(); reList.add(new ArrayList<Integer>()); //保证顺序 Arrays.sort(S); for(int num:S){ ArrayList<ArrayList<Integer>> tmpList = new ArrayList<>(); for(ArrayList<Integer> curr:reList){ //这个步骤是直接将curr转为新的Arraylist,然后在后面追加一个元素 tmpList.add(new ArrayList<Integer>(curr){{add(num);}}); } for(ArrayList<Integer> newList:tmpList){ reList.add(newList); } } //自定义Comparator对象,自定义排序,按照长度和内部元素大小排序 Comparator c = new Comparator<ArrayList<Integer>>() { @Override public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) { // TODO Auto-generated method stub if(o1.size() == o2.size()){ for(int i=0; i<o1.size(); i++){ if(o1.get(i) != o2.get(i)){ return o1.get(i) - o2.get(i); } } } return o1.size() - o2.size() ; } }; reList.sort(c); return reList; } }