public void dfs(List<List<Integer>> res, List<Integer> temp, int begin, int[] nums) {
        res.add(new ArrayList<>(temp));
        for (int i = begin; i < nums.length; ++i) {
            int val = nums[i];
            temp.add(val);
            dfs(res, temp, i + 1, nums);
            while (i + 1 < nums.length && nums[i] == nums[i + 1])
                ++i;
            temp.remove(temp.size() - 1);
        }
    }