题目
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subsets-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
无官方题解
感想
参考78-子集,直接改用HashSet,效率比较低。要想高效率就老老实实写回溯算法递归:
执行用时 :19 ms, 在所有 Java 提交中击败了16.90%的用户
内存消耗 :38.6 MB, 在所有 Java 提交中击败了47.42%的用户
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
HashSet<List<Integer>> res = new HashSet<>();
//Arrays.sort(nums); 在这里排序,下面就不用每次都排了。可以提升一丁点效率
for(int i=0;i<(1<<nums.length);i++){
List<Integer> list = new LinkedList<>();
int count = 0;
int rem = i;
while(rem!=0){
if(rem%2==1) list.add(nums[count]);
rem/=2;
count++;
}
Collections.sort(list);//这里可以删掉改成上面注释的地方排序。
//改完之后:
//执行用时 :11 ms, 在所有 Java 提交中击败了25.81%的用户
//内存消耗 :37.9 MB, 在所有 Java 提交中击败了61.43%的用户
res.add(list);
}
return new LinkedList<>(res);
}
}