思路
跟Subsets的思路几乎一样,只是增加了一个去重。去重思路:排序之后的数组可以是[1,2,2],这样假设nums[i] == nums[i-1]并且i > startIndex(说明i和startIndex之间隔着至少一个数字),这样两个条件和到一起就说明是前面有个一样的数字没有被使用,于是需要跳过该情况。
时间复杂度O(2^n)
空间复杂度O(logn)
代码
public class Solution {
/**
* @param nums: A set of numbers.
* @return: A list of lists. All valid subsets.
*/
public List<List<Integer>> subsetsWithDup(int[] nums) {
// write your code here
List<List<Integer>> results = new ArrayList<>();
if (nums == null) {
return results;
}
Arrays.sort(nums);
dfs(nums, 0, new ArrayList<>(), results);
return results;
}
private void dfs(int[] nums,
int startIndex,
List<Integer> subset,
List<List<Integer>> results) {
results.add(new ArrayList<>(subset));
for (int i = startIndex; i < nums.length; i++) {
// last index is startIndex - 1, then if there's a gap between i and last index,
// it means that the first element doesn't contain in the subset => skip.
if (i != 0 && nums[i] == nums[i - 1] && i > startIndex) {
continue;
}
subset.add(nums[i]);
dfs(nums, i + 1, subset, results);
subset.remove(subset.size() - 1);
}
}
}