力扣-46-全排列

传送门

给定一个没有重复数字的数列,输入该数列的全排列。

这是一道回溯法(递归思想)的题目,可以通过递归来枚举所有的排列组合,为了避免重复使用某个数字,可以用flag标记每个数字是否使用。

代码方面,回溯法的框架如下,细品:

result = []
def backtrack(路径, 选择列表):
    if 满足结束条件:
        result.add(路径)
        return
    
    for 选择 in 选择列表:
        做选择
        backtrack(路径, 选择列表)
        撤销选择
/*递归*/
#include <cstring>
#include <string.h>
#include <algorithm>
using namespace std;

class Solution {
private:
    vector<int> path;  /*记录排列的path*/
    vector<int> nums; 
    vector<vector<int> > res;    /*全排列结果*/
    int flag[1005];
    
public:
    void dfs(int num){
        if (num == 0){ /*num表示差num个数字就形成一个排列*/
            res.push_back(path);
            return ;
        }
        for(int i = 0; i < nums.size(); i++){
            if(flag[i]) continue;
            flag[i] = 1; 
            path.push_back(nums[i]);
            dfs(num - 1);
            path.pop_back();
            flag[i] = 0;
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        this->nums = nums;
        memset(flag, 0, sizeof(flag));
        dfs(nums.size());
        return res;
    }
};

 

posted @ 2020-07-12 15:09  Peterxiazhen  阅读(292)  评论(0编辑  收藏  举报