class Solution {
    private List ls;
    private int n;
    private LinkedList path;
    public List> subsetsWithDup(int[] nums) {
        ls = new LinkedList>();
        path = new LinkedList();
        n = nums.length;
        Arrays.sort(nums);
        dfs(nums, 0);
        return ls;
    }
    private void dfs(int[] nums, int u) {
        if (u == n) {
            ls.add(path.clone());
            return;
        }
        int k = 0;
        while (u + k < n && nums[u + k] == nums[u])
            k++;
        for (int i = 0; i <= k; i++) {  //看看几个连续的数
            dfs(nums, u + k);
            path.add(nums[u]); //也就是连续加了多少次nums[u] 前后导致重复出现  递归变成nums[u]连续出现几次 也就是对象是一连串的数字而非一连串的数字中的一个一个
                                //而且是按顺序个数递增 所以不用考虑 2(1) 2(2) 和2(2) 2(1)元素位置上的变化
        }                       //只是求子集 所以每个数只考虑选不选 而不需考虑顺序
        for (int i = 0; i <= k; i++) //恢复现场 吐出来
            path.removeLast();
    }
}