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 =
If S =
[1,2,2], a solution is:[ [2], [1], [1,2,2], [2,2], [1,2], [] ]Understand the problem:
This is an extension of the last problem. The major difference is the array contains duplicates. It asks for returning all distant subsets.
For the input S = [1, 2, 2], if we use exactly the same approach as the last problem, what shall we get?
Solution:
Similar to the permutation II, we check the range from start to i contains duplicated numbers, if yes, simply jump to next iteration.
Code (Java):
public class Solution {
public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if (num == null || num.length == 0) return result;
Arrays.sort(num);
result.add(new ArrayList<Integer>());
ArrayList<Integer> temp = new ArrayList<Integer>();
subsetsHelper(num, 0, temp, result);
return result;
}
private void subsetsHelper(int[] num, int start, ArrayList<Integer> temp, ArrayList<ArrayList<Integer>> result) {
if (start >= num.length) return;
for (int i = start; i < num.length; i++) {
if (!isDup(num, start, i)) {
temp.add(num[i]);
result.add(new ArrayList<Integer>(temp));
subsetsHelper(num, i + 1, temp, result);
temp.remove(temp.size() - 1);
}
}
}
private boolean isDup(int[] num, int start, int end) {
for (int i = start; i <= end - 1; i++) {
if (num[i] == num[end]) return true;
}
return false;
}
}
Discussion:
This problem has time complexity of O(2^n), since finding all subsets of a set is a NP problem.
Summary:
The take away message is all permutation and combination questions share very similar ways of solution. Make sure to understand the details.
No comments:
Post a Comment