iven 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], [] ]
這道題最大的特點就是不能重複。就是只能有一個2,或者兩個2,但是結果中不能出現有兩個一個2在result set 中
所以這個題和之前的subset的區別就是將同一個結果統一起來,
還有一種方法就是可以利用之前已經得到的結果來
public class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
HashMap<Integer, Integer> record = new HashMap<Integer, Integer>();
List<Integer>tem = new ArrayList<Integer>();
int length = nums.length;
if(length <= 0)
return result;
result.add(tem);
for(int i = 0; i < length; i++){
if(record.containsKey(nums[i])){
record.put(nums[i],record.get(nums[i] + 1));
}
else{
record.put(nums[i],1);
}
}
Set<Integer> keys = record.keySet();
Iterator iterator = keys.iterator();
//we can use the original set and then add a new element and then add the result to the result set.
while(iterator.hasNext()){
int number = (Integer)iterator.next();
int times = record.get(number);
int size = result.size();
for(int i = 0; i < size; i++){
List<Integer> originalOne = result.get(i);
for(int j = 1; j <= times; j++){
List<Integer> addednew = new ArrayList<Integer>(originalOne);
int k = j;
while(k > 0){
addednew.add(number);
k--;
}
result.add(addednew);
}
}
}
return result;
}
}