Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Example:
Input: [1,2,2]
Output:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
思路动态规划
本题一看到就想到动态规划
动态规划的模板已经很熟悉
但是不明白里面到底怎么写
为什么本题需要去重?
如何通国遍历中去重来去除重复子集?
如果说按别人写的 nums[i] == nums[i - 1] 就continue 为什么结果会出现 [1,2,2],
[2,2],这种情况?
{1,2,2} 2 和2难道不重复吗?逻辑不通
自己研究了一会
去掉去重的结果
[[],[1],[1,2],[1,2,2],[1,2],[2],[2,2],[2]]
去重的结果(正确的)
[[],[1],[1,2],[1,2,2],[2],[2,2]]
所谓的不想要重复的子集是因为input 里有重复的, 而subset 题中input 没有重复
如果有重复的就会出现很多一样的结果所以要去重
最恶心的是 明明写的一摸一样的代码
我自己的就超时
复制别人的就通过
研究半小时后我自己写的也通过了
晕的不能再晕
如果有清楚的网友能不能细致帮我讲讲?
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if(nums == null|| nums.length == 0){
return res;
}
Arrays.sort(nums);
List<Integer> list = new ArrayList<>();
dfs(res,list,nums,0);
return res;
}
private void dfs(List<List<Integer>> res,List<Integer> list, int[] nums, int start){
res.add(new ArrayList<>(list));
for (int i = start; i < nums.length; i++) {
if (i != 0 && nums[i] == nums[i - 1] && i > start) {
continue;
}
list.add(nums[i]);
dfs(res,list,nums,i+1);
list.remove(list.size() - 1);
}
}
}