1. 程式人生 > >15. 全排列(DFS)

15. 全排列(DFS)

程式碼:
class Solution {
public:
    /*
     * @param nums: A list of integers.
     * @return: A list of permutations.
     */
    vector<vector<int>> permute(vector<int> &nums) {
        // write your code here
        vector<vector<int> >result;
        vector<int>temp;
        vector<bool>visited(nums.size(),false);
        permuteDFS(nums,0,visited,temp,result);
        return result;
    }
    void permuteDFS(vector<int>&nums,int level,vector<bool>&visited,vector<int>&temp,vector<vector<int> >&result)
    {
        if(level==nums.size())
        result.push_back(temp);
        else
        {
            for(int i=0;i<nums.size();i++)
            {
                if(!visited[i])
                { 
                visited[i]=true;
                temp.push_back(nums[i]);
                permuteDFS(nums,level+1,visited,temp,result);
                temp.pop_back();//將最後一個元素取出,並將其設定為未訪問過,進行回溯
                visited[i]=false;
                }
            }
        }
    }
};
程式碼解析:
 if(!visited[i])
                { 
                visited[i]=true;
                temp.push_back(nums[i]);
                permuteDFS(nums,level+1,visited,temp,result);
                temp.pop_back();//將最後一個元素取出,並將其設定為未訪問過,進行回溯
                visited[i]=false;
                }
其中temp.pop_back()和visited[i]=false,就是為下次回溯做準備,比如我們得到了全排列1,2,3,他的接下來的全排列為1,3,2。