回溯思想應用: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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章