西安网站制作公司排,深圳团购网站设计多少钱,360建筑网是什么平台,WordPress自动readmore给你一个整数数组 nums #xff0c;其中可能包含重复元素#xff0c;请你返回该数组所有可能的 子集。 解集 不能 包含重复的子集。返回的解集中#xff0c;子集可以按 任意顺序 排列。
示例 1#xff1a; 输入#xff1a;nums [1,2,2] 输出#xff1a;[[],[1],[1,2],[…给你一个整数数组 nums 其中可能包含重复元素请你返回该数组所有可能的 子集。 解集 不能 包含重复的子集。返回的解集中子集可以按 任意顺序 排列。
示例 1 输入nums [1,2,2] 输出[[],[1],[1,2],[1,2,2],[2],[2,2]] 示例 2 输入nums [0] 输出[[],[0]]
提示 1 nums.length 10 -10 nums[i] 10
解题思路
迭代法实现子集枚举 考虑数组 [1,2,2]选择前两个数或者第一、三个数都会得到相同的子集。 也就是说对于当前选择的数 x若前面有与其相同的数 y且没有选择 y此时包含 x 的子集必然会出现在包含 y 的所有子集中。 我们可以通过判断这种情况来避免生成重复的子集。代码实现时可以先将数组排序迭代时若发现没有选择上一个数且当前数字与上一个数相同向下一个位置递归迭代时当前递归路径下的集合不需要选取当前元数以避免重复。
代码实现
class Solution {public ListListInteger subsetsWithDup(int[] nums) {SetListInteger r new HashSet();Arrays.sort(nums);dfs23(nums, r, 0, new ArrayList());return new ArrayList(r);}private void dfs23(int[] nums, SetListInteger r, int i, ListInteger t) {if (i nums.length) {r.add(new ArrayList(t));return;}for (int j i; j nums.length; j) {dfs23(nums, r, j 1, t); // 不选取元素if (j 0 nums[j] nums[j - 1] (t.size() 0 t.get(t.size() - 1) ! nums[j])) {continue;}t.add(nums[j]); // 选取元素dfs23(nums, r, j 1, t);t.remove(t.size() - 1);}}
}