// 定义一个解决方案类,用于解决子集问题(包括重复元素)
class Solution {
// 初始化结果容器,用于存储最终生成的所有不同子集
List<List<Integer>> res = new ArrayList<>();
// 初始化路径容器,用于在回溯过程中记录当前递归路径上的元素
LinkedList<Integer> path = new LinkedList<>();
// 公共方法:生成给定整数数组 nums 的所有子集(包含重复元素的子集)
public List<List<Integer>> subsetsWithDup( int[] nums ) {
// 首先对输入数组进行排序,以便处理重复元素时可以跳过不必要的递归分支
Arrays.sort( nums );
// 调用辅助函数开始递归生成子集
subsetsWithDupHelper( nums, 0 );
// 返回包含所有子集的结果容器
return res;
}
// 私有辅助方法:用于递归生成子集,参数 start 表示当前考虑起始位置的下标
private void subsetsWithDupHelper( int[] nums, int start ) {
// 将当前路径中的元素复制到一个新的ArrayList中,并添加至结果容器
res.add( new ArrayList<>( path ));
// 遍历从 start 下标开始的数组元素
for ( int i = start; i < nums.length; i++ ) {
// 如果当前元素与前一个元素相同,并且不是第一次遍历该层,则跳过以避免产生重复子集
if ( i > start && nums[i - 1] == nums[i] ) {
continue;
}
// 将当前元素添加至路径
path.add( nums[i] );
// 递归调用自身,继续构建下一个层级的子集
subsetsWithDupHelper( nums, i + 1 );
// 回溯操作:移除刚添加的元素,准备进入上一层级的其他分支
path.removeLast();
}
}
}
这段代码实现了一个Java类 Solution,其主要功能是找到一个包含重复元素的整数数组的所有可能子集。通过使用 ArrayList 存储最终结果集合,以及利用 LinkedList 存储当前递归路径中的元素,能够有效地处理重复元素并保证子集的唯一性。通过 subsetsWithDupHelper 方法进行深度优先搜索(DFS)的回溯算法来遍历所有子集组合,并将产生的每个有效子集添加到结果集中。