leetCode-90-SubsetsII
题目描述(中等难度)
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
Arrays.sort(nums); //排序
getAns(nums, 0, new ArrayList<>(), ans);
return ans;
}
private void getAns(int[] nums, int start, ArrayList<Integer> temp, List<List<Integer>> ans) {
ans.add(new ArrayList<>(temp));
for (int i = start; i < nums.length; i++) {
//和上个数字相等就跳过
if (i > start && nums[i] == nums[i - 1]) {
continue;
}
temp.add(nums[i]);
getAns(nums, i + 1, temp, ans);
temp.remove(temp.size() - 1);
}
}
时间复杂度: 空间复杂度: 根据数组 [ 1 2 3 ]
[ ]的所有子串 [ ]
[ 1 ] 个的所有子串 [ ] [ 1 ]
[ 1 2 ] 个的所有子串 [ ] [ 1 ] [ 2 ][ 1 2 ]
[ 1 2 3 ] 个的所有子串 [ ] [ 1 ] [ 2 ] [ 1 2 ] [ 3 ] [ 1 3 ] [ 2 3 ] [ 1 2 3 ]
但是如果有重复的数字,会出现什么问题呢 我们发现出现了重复的数组,那么我们可不可以像解法一那样,遇到重复的就跳过这个数字呢?答案是否定的,如果最后一步 [ 1 2 2 ] 增加了 2 ,跳过后,最终答案会缺少 [ 2 2 ]、[ 1 2 2 ] 这两个解。我们仔细观察这两个解是怎么产生的。 我们看到第 4 行黑色的部分,重复了,是怎么造成的呢? 第 4 行新添加的 2 要加到第 3 行的所有解中,而第 3 行的一部分解是旧解,一部分是新解。可以看到,我们黑色部分是由第 3 行的旧解产生的,橙色部分是由新解产生的。 而第 1 行到第 2 行,已经在旧解中加入了 2 产生了第 2 行的橙色部分,所以这里如果再在旧解中加 2 产生黑色部分就造成了重复。 所以当有重复数字的时候,我们只考虑上一步的新解,算法中用一个指针保存每一步的新解开始的位置即可。 时间复杂度: 空间复杂度:O(1)。解法二 迭代法
数组 [ 1 2 2 ]
[ ] 的所有子串 [ ]
[ 1 ] 的所有子串 [ ] [ 1 ]
[ 1 2 ] 的所有子串 [ ] [ 1 ] [ 2 ][ 1 2 ]
[ 1 2 2 ] 的所有子串 [ ] [ 1 ] [ 2 ] [ 1 2 ] [ 2 ] [ 1 2 ] [ 2 2 ] [ 1 2 2 ]
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
ans.add(new ArrayList<>());// 初始化空数组
Arrays.sort(nums);
int start = 1; //保存新解的开始位置
for (int i = 0; i < nums.length; i++) {
List<List<Integer>> ans_tmp = new ArrayList<>();
// 遍历之前的所有结果
for (int j = 0; j < ans.size(); j++) {
List<Integer> list = ans.get(j);
//如果出现重复数字,就跳过所有旧解
if (i > 0 && nums[i] == nums[i - 1] && j < start) {
continue;
}
List<Integer> tmp = new ArrayList<>(list);
tmp.add(nums[i]); // 加入新增数字
ans_tmp.add(tmp);
}
start = ans.size(); //更新新解的开始位置
ans.addAll(ans_tmp);
}
return ans;
}
看完两件小事
如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:
- 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
- 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
本文著作权归作者所有,如若转载,请注明出处
转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com