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

LeetCode——Hot 100【全排列】

题目

题目链接:全排列

题目分析

全排列问题是指,给定一个不含重复数字的数组,生成其所有可能的排列组合。例如,数组 [1,2,3] 的全排列有 [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 这些情况。

解题思路

本题采用回溯算法来解决。回溯算法的核心思想是深度优先搜索(DFS),通过尝试所有可能的选择,在满足条件时记录结果,不满足时回退(撤销选择),继续尝试其他选择。

AC代码

class Solution {vector<vector<int>> ret;bool check[7];vector<int> path;public:void dfs(vector<int> nums) {if (path.size() == nums.size()) {ret.push_back(path);return;}for (int i = 0; i < nums.size(); i++) {if (check[i] == false) {path.push_back(nums[i]);check[i] = true;dfs(nums);path.pop_back();check[i] = false;}}}vector<vector<int>> permute(vector<int>& nums) {dfs(nums);return ret;}
};

代码详解

  1. 成员变量定义
    • vector<vector<int>> ret:用于存储最终所有的全排列结果。
    • bool check[7]:长度为 7 的布尔数组(因为题目中提示数组长度不超过 6),用于标记数组中的元素是否已经被使用到当前的排列路径中。
    • vector<int> path:用于存储当前正在构建的排列路径。
  2. dfs 函数
    • 函数作用:深度优先搜索生成全排列。
    • 终止条件:当 path 的长度等于输入数组 nums 的长度时,说明已经生成了一个完整的全排列,将当前 path 复制一份添加到 ret 中,然后返回。
    • 遍历与选择:遍历输入数组 nums 中的每个元素,如果该元素未被使用(check[i] == false),则将其标记为已使用(check[i] = true),添加到当前路径 path 中,然后递归调用 dfs 函数继续生成下一个位置的元素。
    • 回溯操作:递归返回后,进行回溯,将该元素从 path 中移除(path.pop_back()),并标记为未使用(check[i] = false),以便其他排列路径可以使用该元素。

示例:(以 nums = [1,2,3] 为例)

  • 初始时,path 为空,check 数组全为 false
  • 第一次调用 dfs,遍历到 i = 0(元素 1),check[0] 设为 truepath 变为 [1],递归调用 dfs
  • 在递归的 dfs 中,path 长度为 1,继续遍历。遍历到 i = 1(元素 2),check[1] 设为 truepath 变为 [1,2],递归调用 dfs
  • 再次递归的 dfs 中,path 长度为 2,继续遍历。遍历到 i = 2(元素 3),check[2] 设为 truepath 变为 [1,2,3],此时 path 长度等于 nums 长度(3),将 [1,2,3] 加入 ret。然后回溯,path 弹出 3check[2] 设为 false
  • 回到上一层,继续遍历 i = 2 之后的元素(无),再回溯,path 弹出 2check[1] 设为 false
  • 继续在这一层遍历 i = 2(元素 3),check[2] 设为 truepath 变为 [1,3],递归调用 dfs,后续生成 [1,3,2] 并加入 ret,以此类推,最终生成所有全排列。

总结

该代码通过回溯算法,深度优先地遍历所有可能的排列情况,成功生成了数组的全排列,逻辑清晰,是解决全排列问题的经典方法。

http://www.dtcms.com/a/464767.html

相关文章:

  • 云南大理拍婚纱照价格表建网站优化
  • 双目测距实战1-环境配置
  • 2025人工智能在无人机数据处理中的应用
  • 阿里开源Qwen3-Omni-30B-A3B三剑客——Instruct、Thinking 和 Captioner
  • 长春建站程序湖南网络科技有限公司
  • xtuoj Can you raed it croretcly?
  • 异构动作空间
  • 【Nginx开荒攻略】Nginx虚拟主机配置:从域名、端口到IP的完整指南
  • 小杰深度学习(nine)——CUDA与CuDNN安装
  • 鸿蒙NEXT USB Host模式开发完全指南
  • MinerU2.5 windows 本地部署
  • UIkit中使用新版UICollectionViewCompositionalLayout进行复杂布局(二)
  • 网站建设的技术问题苏州吴江建设局招标网站
  • 河南省村镇建设处网站网站配色与布局 教材
  • Prometheus运维之路(ES监控接入)
  • OpenAMP专题(一):一文了解OpenAMP全貌
  • C++ 中 rfind 方法详解
  • SpringBoot 教程(十四) SpringBoot之集成 Redis(优化版)
  • 【Linux】线程同步与互斥(上)
  • 图观 模型编辑器
  • Win11 输入延迟与鼠标卡顿:系统化排查与优化指南
  • 【开题答辩全过程】以 爱运动健身小程序的设计与实现为例,包含答辩的问题和答案
  • Linux 内核IIO sensor驱动
  • 《Linux系统编程之入门基础》【Linux的前世今生】
  • 活动汪活动策划网站龙岗建设网站
  • Apache IoTDB 架构特性与 Prometheus+Grafana 监控体系部署实践
  • LLM时代基于unstructured解析非结构化pdf
  • uniapp tab切换及tab锚点效果(wx小程序及H5端)
  • Hadoop面试题及详细答案 110题 (71-85)-- 集群部署与运维
  • 5-1〔OSCP ◈ 研记〕❘ SQL注入攻击▸SQL注入理论基础