写在前面
是这样的,今天的力扣题求数组子集,但是要求不能有重复的,我想的难道要暴力比较?但是又想了一下,实现的可能性很小,因为子集中元素的个数也是个问题。直接用本方法吧。
笨方法
原本上网搜了一下,说用List中的retainAll方法,但是这个行不通,retainAll方法是如果有包含的元素全部相同就返回false,否则返回true,但是无法解决个数的问题,所以后来我想的很简单,直接sort然后equlas就行,两个集合sort之后可以直接equals判断了。这里代码就不写了。
用set去重
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
Set<List<Integer>> ans = new HashSet<>();
List<Integer> cur = new ArrayList<>();
dfs(nums, 0, cur, ans);
return new ArrayList<>(ans);
}
/**
* @param nums 原输入数组
* @param u 当前决策到原输入数组中的哪一位
* @param cur 当前方案
* @param ans 最终结果集
*/
void dfs(int[] nums, int u, List<Integer> cur, Set<List<Integer>> ans) {
// 所有位置都决策完成,将当前方案放入结果集
if (nums.length == u) {
ans.add(new ArrayList<>(cur));
return;
}
// 选择当前位置的元素,往下决策
cur.add(nums[u]);
dfs(nums, u + 1, cur, ans);
// 不选当前位置的元素(回溯),往下决策
cur.remove(cur.size() - 1);
dfs(nums, u + 1, cur, ans);
}
}
作者:AC_OIer
链接:https://leetcode-cn.com/problems/subsets-ii/solution/gong-shui-san-xie-yi-ti-shuang-jie-hui-s-g77q/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
看了看大佬的题解,又学到了许多东西。原来Set可以直接去重,省的sort浪费时间了。而且可以把集合放到构造函数中,十分方便。
我的方法用时20ms,大佬的5ms。