LeetCode 全排列问题(中级算法-回溯算法)C++解法

题目描述

给定一个没有重复数字的序列,返回其所有可能的全排列。

示例:

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

思路

全排列函数 qpl,传入一个参数n,代表当前交换的首元素,然后遍历交换其与剩下的元素,每次交换之后,调用qpl函数,传入n+1,即 qpl 目前交换元素后剩下的位数的全排列,然后再交换回来。当交换到最后一位,传入结果集中。

代码

class Solution {
public:
    vector<vector<int> > ans;
    void qpl(vector<int>& nums, int n,vector<vector<int> > &ans)
    { // n 为 交换的首位元素
        if(n==nums.size()) { // 返回条件 不能再交换了
            ans.push_back(nums); 
            return ;
        }
        for(int i=n; i<nums.size(); i++) //交换首位元素和(包括其本身)后面的元素
        { //为什么要包括其本身呢,因为要 qpl 后面的元素,你可以试试 i=n+1开始
            swap(nums[n],nums[i]);
            qpl(nums, n+1,ans);
            swap(nums[n],nums[i]);
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        qpl(nums,0,ans);
        return ans;
    }
};

其他

可能写的不是很好,多多见谅,欢迎指导。网上没找到太多C++的写法,所以来写一下。

发布了7 篇原创文章 · 获赞 0 · 访问量 129
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览