15. 全排列(DFS)

描述

给定一个数字列表,返回其所有可能的排列。

你可以假设没有重复数字。

您在真实的面试中是否遇到过这个题?  

样例

给出一个列表[1,2,3],其全排列为:

[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

思路:
利用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。
如果得到的1,3,2呢,就是先将1,2,3中的3取出,并将3设置为未访问,执行一次循环后将3加入,此时2被设置为未访问,执行循环将其加入。

猜你喜欢

转载自blog.csdn.net/weixin_41413441/article/details/80929205
今日推荐