• 暴力法思路:
        遍历数组,当一个元素被选中时,子集就是前面所有的子集加上当前当元素。

  • 题目注意点:
        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;
      }
    }