Loading

46-全排列

来自labuladong的思想(leetcode)

解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需要思考 3 个问题:

1、路径:也就是已经做出的选择。

2、选择列表:也就是你当前可以做的选择。

3、结束条件:也就是到达决策树底层,无法再做选择的条件。

如果你不理解这三个词语的解释,没关系,我们后面会用「全排列」和「N 皇后问题」这两个经典的回溯算法问题来帮你理解这些词语是什么意思,现在你先留着印象。

代码方面,回溯算法的框架

result = []
def backtrack(路径, 选择列表):
    if 满足结束条件:
        result.add(路径)
        return
    
    for 选择 in 选择列表:
        做选择
        backtrack(路径, 选择列表)
        撤销选择
View Code

其核心就是 for 循环里面的递归,在递归调用之前「做选择」,在递归调用之后「撤销选择」。

class Solution {
public:
    vector<vector<int>> res;    //路径
    void swap(int  &a, int &b)
    {
        int temp;
        temp=a;
        a=b;
        b=temp;
    }
    void backtrack(vector<vector<int>> &res,vector<int> &nums, int n)       //回溯函数 ,路径,选择列表
    {
        if(n==nums.size())                                   //结束条件
        {
            res.push_back(nums);                              //形成一个全排列,就放入res中
        }
        for(int i=n;i<nums.size();i++)                        
        {
            swap(nums[i],nums[n]);                           //递归之前做选择
            backtrack(res,nums,n+1);                         
            swap(nums[i],nums[n]);                           //递归之后撤掉选择
        }
        

    }

    vector<vector<int>> permute(vector<int>& nums) {
        backtrack(res,nums,0);
        return res;
    }
};
View Code

 

知识点相关链接:https://blog.csdn.net/rookie_Hyg/article/details/103998956

posted @ 2020-02-29 20:07  是凉城吖  阅读(143)  评论(0编辑  收藏  举报