当前位置:   article > 正文

198.回溯算法:子集(力扣)

198.回溯算法:子集(力扣)

代码解决

  1. class Solution {
  2. public:
  3. // 用于存储当前子集的临时向量
  4. vector<int> res;
  5. // 用于存储所有子集的结果向量
  6. vector<vector<int>> result;
  7. // 回溯函数
  8. void backtracing(vector<int>& nums, int index) {
  9. // 每次递归调用都将当前子集添加到结果中
  10. result.push_back(res);
  11. // 如果当前索引超过了数组的大小,返回
  12. if (index >= nums.size()) {
  13. return;
  14. }
  15. // 遍历从当前索引到数组末尾的所有元素
  16. for (int i = index; i < nums.size(); i++) {
  17. // 将当前元素添加到临时子集中
  18. res.push_back(nums[i]);
  19. // 递归调用,处理下一个元素
  20. backtracing(nums, i + 1);
  21. // 回溯,移除最后添加的元素,继续处理下一个可能的子集
  22. res.pop_back();
  23. }
  24. }
  25. // 主函数,生成所有子集
  26. vector<vector<int>> subsets(vector<int>& nums) {
  27. // 从第0个元素开始回溯
  28. backtracing(nums, 0);
  29. // 返回所有生成的子集
  30. return result;
  31. }
  32. };

过程描述

假设输入数组为[1, 2, 3],代码生成子集的过程如下:

  1. 初始化空子集并添加到结果中:[]
  2. 从第一个元素开始,添加1,递归生成子集:[1]
    • 添加到结果中:[[], [1]]
    • 继续添加2,递归生成子集:[1, 2]
      • 添加到结果中:[[], [1], [1, 2]]
      • 继续添加3,递归生成子集:[1, 2, 3]
        • 添加到结果中:[[], [1], [1, 2], [1, 2, 3]]
      • 回溯,移除3,继续处理其他可能的子集
    • 回溯,移除2,继续处理其他可能的子集
      • 添加3,递归生成子集:[1, 3]
        • 添加到结果中:[[], [1], [1, 2], [1, 2, 3], [1, 3]]
  3. 回溯,移除1,继续处理其他可能的子集
    • 添加2,递归生成子集:[2]
      • 添加到结果中:[[], [1], [1, 2], [1, 2, 3], [1, 3], [2]]
      • 继续添加3,递归生成子集:[2, 3]
        • 添加到结果中:[[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3]]
    • 回溯,移除2,继续处理其他可能的子集
      • 添加3,递归生成子集:[3]
        • 添加到结果中:[[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]]
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/776998
推荐阅读
相关标签
  

闽ICP备14008679号