IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 46 全排列(c++ 回溯实现) -> 正文阅读

[C++知识库]46 全排列(c++ 回溯实现)

题目

给定一个不含重复数字的数组 nums ,返回其所有可能的全排列 。你可以按任意顺序返回答案。

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

class Solution {
public:
    vector<vector<int>> result;//记录最终的全排列结果
    vector<int> path;//记录一个全排列结果
    
    void backtracking(vector<int>& nums, vector<bool>& used, int index){//当前处理排列的第index号位
        if(path.size() == nums.size()){//递归边界,已获得一个全排列
            result.push_back(path);//将该全排列加入到结果中
            return;
        }
        for(int i = 0; i < nums.size(); i++){//逐个枚举,试图将该数填入到path[i]中
            if(used[i] == false){//如果该数还未被使用,即不再当前排列中
            used[i] = true;//记录该数在排列中
            path.push_back(nums[i]);//将该数加入到排列中
            backtracking(nums, used, index+1);//处理nums的第index+1号位
            path.pop_back();
            used[i] = false;//已处理完path[i]的子问题,恢复状态
            }
        }
    }
    
    vector<vector<int>> permute(vector<int>& nums) {
        result.clear();
        path.clear();
        vector<bool> used(nums.size(), false);//记录nums中的数是否已在排列中
        backtracking(nums, used, 0);//从0号位开始处理
        return result;
    }
};
  • 全排列问题
    • 指n个数所能形成的所以排列
    • 如果要按字典序输出排列结果,只需先对nums做一次自小到大排序
  • 思路
    • 如果把问题描述成“输出这n个数字的全排列”,那么它就可以被分解为若干个子问题。输出以第一个数为首的全排列,输出以第二个数为首的全排列,…,输出以第n个数为首的全排列。
    • 定义一个向量path存储当前的排列,再定义一个向量used标记nums中的数是否已经被填入到path中,used[i]为true表示nums[i]已经在path中了
    • 现在按顺序往path的第一位到第n位填数字。假设当前已经填好了path[0] ~ path[index - 1], 现在要填path[index]。
    • 枚举此时nums中的数字,如果它还没有在path中,就将它加入path,同时将used[i]设置为true。
    • 然后去填path的下一位,即进行递归。
    • 当递归完成时,再将used[i]还原为false,同时将path的末尾元素弹出。
    • 递归边界为完成一次全排列,即path的长度和nums的长度一致,此时返回。
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-04 11:00:48  更:2021-08-04 11:01:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 10:40:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码