力扣-46-全排列

Posted xiazhenbin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣-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;
    }
};

 

以上是关于力扣-46-全排列的主要内容,如果未能解决你的问题,请参考以下文章

回溯算法详解[力扣46:全排列]

力扣算法JS LC [46. 全排列] LC [47. 全排列 II]

精选力扣500题 第28题 LeetCode 46. 全排列c++ / java 详细题解

leetcode 46. 全排列

DFS_46. 全排列

[LeetCode] 46. 全排列(回溯)