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(); } }