您的位置:首页 > 其它

leetCode 90.Subsets II(子集II) 解题思路和方法

2015-07-25 09:54 513 查看
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],
[]
]


思路:这一题比subsets多一了一道重复,具体代码如下:

public class Solution {
boolean[] b;
Set<String> set;
List<List<Integer>> list;
Set<String> set1;
public List<List<Integer>> subsetsWithDup(int[] nums) {
b = new boolean[nums.length];
set = new HashSet<String>();
list = new ArrayList<List<Integer>>();
set1 = new HashSet<String>();

Arrays.sort(nums);
count(nums,"",nums.length,0);
return list;
}

private void count(int[] nums,String s,int n,int j){
//没有重复才添加
if(set.add(s)){
//以","分割数组
String[] sa = s.split(",");
List<Integer> al = new ArrayList<Integer>();
for(int i = 0; i < sa.length; i++){
if(sa[i].length() > 0){
al.add(Integer.parseInt(sa[i]));
}
}
Collections.sort(al);
if(set1.add(al.toString()))
list.add(al);
}

for(int i = j; i < nums.length;i++){
if(!b[i]){
b[i] = true;
count(nums,s + "," + nums[i],n-1,i+1);
b[i] = false;
}
}
}

}


下面这种写法更简洁:

public class Solution {
List<List<Integer>> list;//结果集
List<Integer> al;//每一项
public List<List<Integer>> subsetsWithDup(int[] nums) {
list = new ArrayList<List<Integer>>();
al = new ArrayList<Integer>();
Arrays.sort(nums);
//排列组合
count(nums,al,0);
return list;
}

private void count(int[] nums,List<Integer> al,int j){

list.add(new ArrayList<Integer>(al));//不重复的才添加

for(int i = j; i < nums.length;i++){
if(i == j || nums[i] != nums[i-1]){//去除重复
al.add(nums[i]);//添加
count(nums,al,i+1);
al.remove(al.size()-1);//去除,为下一个结果做准备
}
}
}

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