您的位置:首页 > 其它

Leetcode-Subsets II

2014-11-16 06:02 423 查看
Given a collection of integers that might contain duplicates, S, 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 S =
[1,2,2]
, a solution is:

[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]

]


Have you met this question in a real interview?

Analysis:
We first create a table of (val,count) to record how many times each number appears in the collection. We then recursive create the subset for each number.

Solution:

public class Solution {
public List<List<Integer>> subsetsWithDup(int[] num) {
List<List<Integer>> numList = new ArrayList<List<Integer>>();
List<List<Integer>> res= new ArrayList<List<Integer>>();
if (num.length==0) return res;

for (int i=0;i<num.length;i++){
int val = num[i];
int index = -1;
boolean hasItem = false;
for (int j=0;j<numList.size();j++)
if (numList.get(j).get(0)<val)
continue;
else if (numList.get(j).get(0)==val){
hasItem = true;
index = j;
break;
} else {
index = j;
break;
}
if (hasItem)
numList.get(index).set(1,numList.get(index).get(1)+1);
else if (index!=-1){
List<Integer> temp = new ArrayList<Integer>();
temp.add(val);
temp.add(1);
numList.add(index,temp);
} else {
List<Integer> temp = new ArrayList<Integer>();
temp.add(val);
temp.add(1);
numList.add(temp);
}
}

res = subsetsRecur(numList,0);
return res;
}

public List<List<Integer>> subsetsRecur(List<List<Integer>> numList, int curIndex){
int val = numList.get(curIndex).get(0);
int num = numList.get(curIndex).get(1);
List<List<Integer>> resList = new ArrayList<List<Integer>>();
if (curIndex==numList.size()-1){
for (int i=0;i<=num;i++){
List<Integer> subset = new ArrayList<Integer>();
for (int j=0;j<i;j++)
subset.add(val);
resList.add(subset);
}
return resList;
}

List<List<Integer>> nextResList = subsetsRecur(numList,curIndex+1);

for (int i=0;i<=num;i++){
List<Integer> subset = new ArrayList<Integer>();
for (int j=0;j<i;j++)
subset.add(val);
for (int j=0;j<nextResList.size();j++){
List<Integer> oneRes = new ArrayList<Integer>();
oneRes.addAll(subset);
oneRes.addAll(nextResList.get(j));
resList.add(oneRes);
}
}
return resList;
}
}


NOTE: To increase runtime speed, we can sort the num list and then scan it once to create the table, like this:

public class Solution {
public List<List<Integer>> subsetsWithDup(int[] num) {
List<List<Integer>> numList = new ArrayList<List<Integer>>();
List<List<Integer>> res= new ArrayList<List<Integer>>();
if (num.length==0) return res;

Arrays.sort(num);
int curVal = num[0];
int count = 1;
for (int i=1;i<num.length;i++)
if (num[i]==curVal){
count++;
} else {
List<Integer> record = new ArrayList<Integer>();
record.add(curVal);
record.add(count);
numList.add(record);
curVal = num[i];
count=1;
}
List<Integer> record = new ArrayList<Integer>();
record.add(curVal);
record.add(count);
numList.add(record);

res = subsetsRecur(numList,0);
return res;
}

public List<List<Integer>> subsetsRecur(List<List<Integer>> numList, int curIndex){
int val = numList.get(curIndex).get(0);
int num = numList.get(curIndex).get(1);
List<List<Integer>> resList = new ArrayList<List<Integer>>();
if (curIndex==numList.size()-1){
for (int i=0;i<=num;i++){
List<Integer> subset = new ArrayList<Integer>();
for (int j=0;j<i;j++)
subset.add(val);
resList.add(subset);
}
return resList;
}

List<List<Integer>> nextResList = subsetsRecur(numList,curIndex+1);

for (int i=0;i<=num;i++){
List<Integer> subset = new ArrayList<Integer>();
for (int j=0;j<i;j++)
subset.add(val);
for (int j=0;j<nextResList.size();j++){
List<Integer> oneRes = new ArrayList<Integer>();
oneRes.addAll(subset);
oneRes.addAll(nextResList.get(j));
resList.add(oneRes);
}
}
return resList;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: