回溯思想应用:002.LeetCode:46. 全排列

class Solution {
public:
    vector<vector<int>>res;
    vector<bool>used;//判断当前情况下第i个节点是否被使用过
    void generatePermutation(const vector<int>& nums,int index,vector<int>& p)
    {
        //nums表示备选数字集合,index表示当前正在处理第几个元素,p指的是在递归的过程中已经生成的排列
        //p中保存了一个有index个元素的排列
        //向这个排列的末尾添加第index+1个元素,获得一个有index+1个元素的排列
        if(index==nums.size()){
            res.push_back(p);
            return;
        }
        //递归逻辑部分
        for(int i=0;i<nums.size();i++)
        {
            //找到第index+1个元素,但是你下一次访问的并且需要添加的元素不能是已经添加过的
            //也就是不能在当前节点递归树节点的祖先节点
            if(!used[i])
            {
                //如果这个数字没有被使用
                //将nums[i]添加在p中
                p.push_back(nums[i]);
                used[i]=true;
                generatePermutation(nums,index+1,p);
                p.pop_back();
                used[i]=false;//向上回溯寻找下一个排列将本节点所代表数字复原为未访问,然后继续下一轮循环
                //找到剩下的全排列
            }
        }
        return;//结束调用
    }

    vector<vector<int>> permute(vector<int>& nums) {
        res.clear();
        if(nums.size()==0)
        {
            return res;
        }

        used=vector<bool>(nums.size(),false);
        vector<int>p;
        generatePermutation(nums,0,p);
        return res;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章