原题链接:
https://leetcode.cn/problems/subsets-ii/description/
完成情况:
解题思路:
这段代码实现了找出给定数组中所有可能的子集,包括重复元素的情况。首先对数组进行排序,然后通过深度优先搜索(DFS)的方式遍历数组元素,对于每个元素,可以选择加入子集或者不加入子集。如果选择加入子集,则继续向下搜索;如果不选择加入子集,则跳过。同时,需要注意处理重复元素的情况,避免重复的子集出现。最终返回所有可能的子集。
具体步骤如下:
- 定义一个整型列表t用于存储当前子集,定义一个二维整型列表ans用于存储所有可能的子集。
- 定义subsetsWithDup函数,对输入的数组进行排序,然后调用dfs函数进行深度优先搜索。
- 定义dfs函数,参数choosePre表示是否选择上一个元素,参数cur表示当前遍历到的数组下标,参数nums表示输入的数组。
- 如果当前下标cur等于数组长度,表示已经遍历完数组,将当前子集加入ans列表中,然后返回。
- 递归调用dfs函数,不选择当前元素,继续向下遍历。
- 如果不选择上一个元素且当前元素等于上一个元素,则跳过。
- 将当前元素加入子集中,递归调用dfs函数,选择当前元素,继续向下遍历。
- 移除当前元素,回溯到上一层。
最终返回所有可能的子集ans。
参考代码:
_90子集II_迭代法
package leetcode板块;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class _90子集II_迭代法 {
List<List<Integer>> result = new ArrayList<List<Integer>>();
List<Integer> tempList = new ArrayList<Integer>();
/**
* 其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
* 解集 不能 包含重复的子集。
* @param nums
* @return
*/
public List<List<Integer>> subsetsWithDup(int[] nums) {
//不能包含重复元素的话,即选一个独立元素值的是否,只能选一次,前后不允许重复
Arrays.sort(nums);
for(int i = 0;i<( 1 << nums.length);++i){
tempList.clear();
boolean flag = true;
for (int j = 0;j<nums.length;++j){
if ((i & (1 << i)) != 0){
if (i>0 && (i >> (i-1) & 1) == 0 && nums[i] == nums[i-1]){
flag = false;
break;
}
tempList.add(nums[i]);
}
}
if (flag){
result.add(new ArrayList<Integer>(tempList));
}
}
return result;
}
}
_90子集II_递归法
package leetcode板块;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class _90子集II_递归法 {
List<List<Integer>> result = new ArrayList<List<Integer>>();
List<Integer> tempList = new ArrayList<Integer>();
/**
* 其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
* 解集 不能 包含重复的子集。
* @param nums
* @return
*/
public List<List<Integer>> subsetsWithDup(int[] nums) {
//不能包含重复元素的话,即选一个独立元素值的是否,只能选一次,前后不允许重复
Arrays.sort(nums);
dfs_subsetsWithDup(false,0,nums);
return result;
}
/**
*
* @param choosePre
* @param curNode
* @param nums
*/
private void dfs_subsetsWithDup(boolean choosePre, int curNode, int[] nums) {
if (curNode == nums.length){
result.add(new ArrayList<>(tempList));
return;
}
dfs_subsetsWithDup(false,curNode+1,nums);
if (!choosePre && curNode > 0 && nums[curNode - 1] == nums[curNode]) return;
tempList.add(nums[curNode]);
dfs_subsetsWithDup(true,curNode+1,nums);
tempList.remove(tempList.size() - 1);
//tempList.remove(tempList.removeLast());
}
}