当前位置: 首页 > news >正文

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

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 (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {continue;}// 如果当前数字未被使用过if (used[i] == false) {used[i] = true; // 标记当前数字已使用res.push_back(nums[i]); // 将当前数字加入当前排列backtracing(nums, used); // 递归处理剩余的数字res.pop_back(); // 回溯,移除最后一个数字used[i] = false; // 标记当前数字未使用}}}// 主函数,生成所有唯一排列vector<vector<int>> permuteUnique(vector<int>& nums) {vector<bool> used(nums.size(), false); // 初始化一个布尔向量用于标记数字是否已被使用sort(nums.begin(), nums.end()); // 排序数组,便于处理重复元素backtracing(nums, used); // 调用回溯函数,开始生成排列return result; // 返回所有的排列组合}
};
  • 递归与回溯

    • 使用递归函数 backtracing 来生成所有的排列组合。
    • 每次选择一个元素加入当前排列 res 中,然后递归处理剩余的元素。
    • 递归结束后,回退到上一步,移除最后加入的元素,继续尝试其他可能的选择。
  • 剪枝

    • 通过 used 数组来避免重复使用已经加入到当前排列中的元素。
    • 通过排序数组以及检查相邻元素来避免生成重复排列:if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false)。这条语句确保了对于重复元素,在一个排列中只考虑第一个出现的元素,从而避免重复排列。
  • 状态变量

    • res:用于存储当前正在构建的排列。
    • result:用于存储所有找到的排列。
    • used:一个布尔数组,用于标记某个元素是否已经在当前排列中使用过,避免重复使用。
http://www.lryc.cn/news/383726.html

相关文章:

  • 什么是数据库范式,为什么要反范式?
  • 记录 Bonobo Git 服务器 SMTP 设置
  • 事务性邮件发送如何选择邮件群发工具
  • 替换特殊符号
  • 深入浅出 langchain 1. Prompt 与 Model
  • C#二进制、十进制、十六进制数据转换
  • 晶方科技:台积电吃饱,封装迎春?
  • ConcurrentModificationException
  • 倾斜摄影OSGB一键轻量化输出3dTiles!
  • 深度清洁:使用npm prune命令优化你的Node.js项目
  • [Gstreamer] gstbasesink 的 QOS 机制
  • 关于bash脚本中extglob不生效的问题
  • idea运行报错 java: 错误: 无效的源发行版:16
  • selenium 处理网页上的弹窗
  • 光模块市场受益于AI热潮同比增长45%,行业前景看好
  • qt经典界面框架
  • 微信群聊不见了?掌握这4个技巧轻松找回,简直太爽了
  • Python Type Hint有啥用
  • 【深度学习】基于因果表示学习的CITRIS模型原理和实验
  • CentOS9镜像下载地址加速下载
  • GPT-5:博士级智能的跨越——未来已来,人机共生的新篇章
  • 陶建辉入选 2023 年度“中国物联网行业卓越人物榜”
  • 2024南京国际自有品牌产品博览会
  • 网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇你就是网络安全高手了。
  • 四步轻松搞定!探索字节最新AnimateDiff-Lightning:高质量视频生成的秘密武器!
  • Jenkins定时构建自动化(一):Jenkins下载安装配置
  • 最新国内首码对接app平台汇总,一手项目资源!
  • 掌握 Perl 中的进程间通信:深入探索 IPC 的世界
  • Vite响应Ajax请求
  • 使用Jenkins进行持续集成与部署