给你一个整数数组 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;
}
文章讨论了如何在包含重复元素的整数数组中找出所有不重复的子集,通过递归和C++实现DFS算法。
1187

被折叠的 条评论
为什么被折叠?



