[LintCode] Subsets

public ArrayList<ArrayList<Integer>> subsets(ArrayList<Integer> S) {
        // write your code here
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        if(S == null || S.size() == 0)
            return res;
        Collections.sort(S);
        ArrayList<Integer> tmp = new ArrayList<Integer>();
        res.add(tmp);
        dfs(res, S, tmp, 0);
        return res;
    }
    public void dfs(ArrayList<ArrayList<Integer>> res, ArrayList<Integer> S, ArrayList<Integer> tmp, int pos) {
        for(int i = pos; i < S.size(); i++) {
            tmp.add(S.get(i));
            res.add(new ArrayList<Integer>(tmp));
            dfs(res, S, tmp, i+1);
            tmp.remove(tmp.size()-1);
        }
    }