您的位置:首页 > 编程语言 > Java开发

[LeetCode][Java] Subsets II

2015-07-19 22:16 411 查看

题目:

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: