public class Solution {
    public ArrayList<ArrayList<Integer>> subsets(int[] S) {
       if(S == null){
           return null;
       }
//         int n = S.length;
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
//         result.add(new ArrayList<Integer>());
//         for(int i = 0;i < n;i++){
//             int size = result.size();
//             for(int j = 0;j< size;j ++){
//                 ArrayList<Integer> path  = new ArrayList<Integer>();
//                 path.addAll(result.get(j));
//                 path.add(S[i]);
//                 result.add(path);
//             }
//         }
//         return result;
        for(int i = 0;i <= S.length ; i++){
            back(i,0, new ArrayList<Integer>(), result, S);
        }
        return result;
    }
    
    private void back(int k , int start, ArrayList<Integer> list, ArrayList<ArrayList<Integer>> result, int[] S){
        if(k < 0){
            return;
        }else if(k == 0){
            result.add(new ArrayList<>(list));
        }else{
            for(int i = start; i < S.length;i++){
                list.add(S[i]);
                back(k - 1, i + 1, list ,result, S);
                list.remove(list.size() - 1);
            }
        }
        
        
        
    }
}