题目链接:https://leetcode.com/problems/subsets-ii/
本题比LeetCode--78. Subsets稍微复杂一点,主要是去重的问题,怎样规避重复呢?这里有多种方法,效率各有不同。类似于LeetCode--47. Permutations II对于LeetCode--46. Permutations的调整。详细内容见https://blog.csdn.net/To_be_to_thought/article/details/85125217和https://blog.csdn.net/To_be_to_thought/article/details/85168644。
代码如下:
class Solution {
public static List<List<Integer>> ret;
public static boolean[] visited;
public List<List<Integer>> subsetsWithDup(int[] nums) {
ret=new LinkedList<>();
visited=new boolean[100];
Arrays.sort(nums);
recursive(0,nums);
return ret;
}
public static void recursive(int idx,int[] nums)
{
if(idx>=nums.length)
{
LinkedList<Integer> tmp=new LinkedList<>();
for(int i=0;i<nums.length;i++)
{
if(visited[i])
tmp.add(nums[i]);
}
ret.add(tmp);
return;
}
if(idx>0 && nums[idx-1]==nums[idx] && visited[idx-1]==false)
{
visited[idx]=false;
recursive(idx+1,nums);
}
else
{
visited[idx]=true;
recursive(idx+1,nums);
visited[idx]=false;
recursive(idx+1,nums);
}
}
}