您的位置:首页 > 游戏 > 手游 > 201.回溯算法:全排列(力扣)

201.回溯算法:全排列(力扣)

2024/10/4 22:10:34 来源:https://blog.csdn.net/weixin_63779802/article/details/139981645  浏览:    关键词:201.回溯算法:全排列(力扣)

class Solution {
public:vector<int> res; // 用于存储当前排列组合vector<vector<int>> result; // 用于存储所有的排列组合void backtracing(vector<int>& nums, vector<bool>& used) {// 如果当前排列组合的长度等于 nums 的长度,说明找到一个完整的排列组合if(res.size() == nums.size()) {result.push_back(res); // 将当前排列组合加入结果集return; // 结束当前递归}// 遍历每一个数字,尝试将其加入当前排列组合for(int i = 0; i < nums.size(); i++) {// 如果当前数字已经被使用过,跳过if(used[i] == true) continue;// 标记当前数字已使用used[i] = true;// 将当前数字加入当前排列组合res.push_back(nums[i]);// 递归处理剩余的数字backtracing(nums, used);// 回溯,移除最后一个数字,并标记其为未使用res.pop_back();used[i] = false;}}vector<vector<int>> permute(vector<int>& nums) {// 初始化一个布尔向量用于标记数字是否已被使用vector<bool> used(nums.size(), false);// 调用回溯函数,开始生成排列组合backtracing(nums, used);// 返回所有的排列组合return result;}
};

 

核心思想

  1. 递归与回溯

    • 使用递归函数 backtracing 来逐步生成排列组合。
    • 每次选择一个元素加入当前排列组合 res 中,然后递归处理剩余的元素。
    • 如果当前排列组合的长度等于输入数组的长度,则表示找到一个完整的排列组合,将其加入结果集 result 中。
    • 递归结束后,回退到上一步,移除最后加入的元素,继续尝试其他可能的选择。
  2. 状态变量

    • res:用于存储当前正在构建的排列组合。
    • result:用于存储所有找到的排列组合。
    • used:一个布尔数组,用于标记某个元素是否已经在当前排列组合中使用过,避免重复使用。
  3. 剪枝

    • 通过 used 数组来避免重复使用已经加入到当前排列组合中的元素。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com