给你一个整数数组 nums
,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
这道题目和78.子集 (opens new window)区别就是集合里有重复元素了,而且求取的子集要去重。
示例 1:
输入:nums = [1,2,2] 输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
本题也可以不使用used数组来去重,因为递归的时候下一个startIndex是i+1而不是0。
#include <stdio.h>
#include <stdlib.h>
int sum=0;
int path[100];
int visited[100];
int top=0;
int nums[3]={1,2,2};
int cmp(const void* a1,const void *a2){
return *((int *)a1)-*((int *)a2);
}
void dfs(int nums[],int startIndex,int numSize)
{
for (int i = 0; i < top; ++i) {
printf("%d ",path[i]);
}
printf("\n");
if (startIndex >= numSize)
return;
for (int i = startIndex; i < numSize; ++i) {
if (i>startIndex && nums[i] == nums[i-1] )
continue;
path[top++] = nums[i];
dfs(nums,i+1,numSize);
top--;
}
}
int main()
{
qsort(nums,3,sizeof(int),cmp);
dfs(nums,0,3);
return 0;
}