90.子集II

发布于:2024-03-17 ⋅ 阅读:(52) ⋅ 点赞:(0)

在这里插入图片描述

// 定义一个解决方案类,用于解决子集问题(包括重复元素)
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)的回溯算法来遍历所有子集组合,并将产生的每个有效子集添加到结果集中。

本文含有隐藏内容,请 开通VIP 后查看