题目:
Given a collection of integers that might contain duplicates, nums, return all possible subsets.
Note:
- Elements in a subset must be in non-descending order.
- The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,2]
, a solution is:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
题意:
给定一个整数集合nums,可能包含重复元素,返回所有的子集。
注意:
1.子集中的元素都是升序排列的
2. 不能含有相同的子集
比如,
如果nums = [1,2,2]
, 一个解为:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
算法分析:
* 与《Subsets》方法类似
* 结合方法Combinations https://leetcode.com/problems/combinations/
* 不同之处在于,出现重复元素,不往 ArrayList<ArrayList<Integer>> fres 里添加
* if(!res.contains(item))
* res.add(new ArrayList<Integer>(item));
AC代码:
<span style="font-family:Microsoft YaHei;">public class Solution
{
public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] nums)
{
ArrayList<ArrayList<Integer>> fres = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> flist= new ArrayList<Integer>();
Arrays.sort(nums);
fres.add(flist);
for(int i=1;i<=nums.length;i++)
{
ArrayList<ArrayList<Integer>> sres = new ArrayList<ArrayList<Integer>>();
sres=combine(nums, i);
fres.addAll(sres);
}
return fres;
}
public static ArrayList<ArrayList<Integer>> combine(int nums[], int k)
{
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
if(nums.length<=0 || nums.length<k)
return res;
helper(nums,k,0,new ArrayList<Integer>(), res);
return res;
}
private static void helper(int nums[], int k, int start, ArrayList<Integer> item, ArrayList<ArrayList<Integer>> res)
{
if(item.size()==k)
{
if(!res.contains(item))
res.add(new ArrayList<Integer>(item));
return;
}
for(int i=start;i<nums.length;i++) // try each possibility number in current position
{
item.add(nums[i]);
helper(nums,k,i+1,item,res); // after selecting number for current position, process next position
item.remove(item.size()-1); // clear the current position to try next possible number
}
}
}</span>