import java.util.*;

public class Solution {
    ArrayList<ArrayList<Integer>> result = new ArrayList<>();
    public ArrayList<ArrayList<Integer>> subsets(int[] S) {
        ArrayList<Integer> r = new ArrayList<>();
        // 找长度为length的子集
        for (int length = 0; length <= S.length; length++) {
            get(S, length, 0, r);
            r.clear();
        }
        return result;
    }

    /**
     * 找长度为length的子集
     * @param s 从s里面找
     * @param length 子集数字个数
     * @param start 从s的第start个元素开始找
     * @param r 已经挑出来的
     */
    private void get(int[] s, int length, int start, ArrayList<Integer> r){
        if(r.size()==length){ // 子集元素数够了,添加
            result.add(new ArrayList<>(r));
            return;
        }
        for (int i = start; i < s.length; i++) {
            r.add(s[i]); // 挑第i个元素
            get(s, length, i+1, r); // 继续挑
            r.remove(r.size() - 1); // 回溯,删除已挑的
        }
    }
}