题目地址
题目描述
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
题解
回溯算法
需要过滤已经走过的路径
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> results = new ArrayList<>();
dfs(results, new ArrayList<>(), nums, 0);
return results;
}
public void dfs(List<List<Integer>> results, List<Integer> result, int[] nums, int index) {
results.add(new ArrayList<>(result));
for (int i = index; i < nums.length; ++ i) {
// 做选择
result.add(nums[i]);
dfs(results, result, nums, i + 1);
// 撤回选择
result.remove(result.size() - 1);
// 如果 nums[i] == nums[i + 1],表示当前分支已经走过了
// 因此要跳过
while (i + 1 < nums.length && nums[i] == nums[i + 1]) {
i ++;
}
}
}
}
网友评论