题目描述
AC代码
/*
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
数字 枚举该数字出现的次数
1: 0,1
2: 0,1,2
所以共有2*3=6种情况
解题根据:枚举每个数字出现的次数
*/
class Solution {
List<List<Integer>> ans=new ArrayList<>();
List<Integer> path=new ArrayList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
dfs(nums,0);
return ans;
}
void dfs(int[] nums,int k){
if(k==nums.length)
{
ans.add(new ArrayList<>(path));
return;
}
//计算当前数字的个数
int cnt=0;
while(cnt+k<nums.length&&nums[cnt+k]==nums[k]) cnt++;
for(int i=0;i<=cnt;i++){
dfs(nums,k+cnt);
path.add(nums[k]);
}
//恢复现场
for(int i=0;i<=cnt;i++)
path.remove(path.size()-1);
}
}