【LeetCode每日一题】46. 全排列 —— DFS算法(C/C++)

写在前面:

时间从来不说话,却回答了所有问题!

题目:

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

示例 1:

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

示例 2:

输入:nums = [0,1] 输出:[[0,1],[1,0]]

示例 3:

输入:nums = [1] 输出:[[1]]

提示:

1 <= nums.length <= 6 -10 <= nums[i] <= 10 nums 中的所有整数 互不相同

思路:

更详细的DFS算法请看这篇:DFS详解 + 例题!!!

本文是典型的DFS模板题,并且是最具代表性的例题之一排列组合类型,没错,就是高中学的排列组合;

下面说说具体思路:首先定义几个数组,具体含义如下

vector<vector> ans; //记录答案 vector a; // 记录每次排列 map<int, int> book; //标记是否被访问

然后循环,当 nums[i] 没有被访问过时,加入数组a,并标记已经被访问,之后进行DFS递归操作,在递归结束后要释放被访问的元素,并弹出数组a。

代码:

vector<vector<int>> ans; //记录答案
vector<int> a; // 记录每次排列 
map<int, int> book; //标记是否被访问 

void DFS(int cur, int n, vector<int>& nums){
          
   
    if(cur == n){
          
   
        ans.push_back(a);
        return ;
    }
    for(int i = 0; i < n; i++){
          
   
        if(book[nums[i]] == 0){
          
   
            a.push_back(nums[i]);
            book[nums[i]] = 1;
            DFS(cur + 1, n, nums);
            book[nums[i]] = 0;
            a.pop_back();
        }
    }
}

vector<vector<int>> permute(vector<int>& nums) {
          
   
    int n = nums.size();
    DFS(0, n, nums);
    
    return ans; 
}


经验分享 程序员 微信小程序 职场和发展