import java.util.*;

public class Solution {

    ArrayList<ArrayList<Integer>> result = new  ArrayList<ArrayList<Integer>>();

    public ArrayList<ArrayList<Integer>> subsets(int[] S) {

        ArrayList<Integer> list = new ArrayList<Integer>();

        Arrays.sort(S);

        for (int i = 0; i <= S.length; i++) {
            backTracing(i, 0, S, list);
        }
        return result;
    }

    // 如:1234 结果应该是
    // 1:k= 0表示增加: [] 
    // 2:k= 1 start=0表示增加: [1] [2] [3] [4]
    // 3:k= 2表示先增加[1],然后在[1]的基础上分别增加[2],[3],[4],结果: [1,2] [1,3] [1,4] 
    // 4:k= 3表示先增加[1],然后在上一步的结果再针对 [1,2] [1,3] [1,4] 中的[1,2]添加3,4 [1,2,3],[1,2,4], 再给[1,3]追加4 [1,3,4]
    // 5:k= 4表示增加: 针对[1,2,3]追加4,[1,2,3,4]
    // 可以看出 每次都是在原有的集合的基础上 增加后面的每一个元素 组成一个新的子集合 如果当前元素后面没有元素了,那么不会被添加到result里面,会被list.remove回溯删除掉
    // k就表示 为list追加几个元素
    public void backTracing (int k, int start, int[] arr, ArrayList<Integer> list) {

        if (k == 0) {
            result.add(new ArrayList(list));
            return;
        }

        for (int j = start; j < arr.length; j++) {
            list.add(arr[j]);
            backTracing(k - 1, j + 1, arr, list);
            list.remove(list.size() - 1);
        }
    }
}