DFS-求全排列

来源:互联网 发布:搜索引擎 数据库 区别 编辑:程序博客网 时间:2024/06/05 19:14

以[1,2,3]为例,若第一个元素为1,则还要求[2,3]的全排列;第一个元素为2,则还有求[1,3]的全排列........故可用递归实现深度优先遍历,遍历出所有的可能

vector<vector<int>> permute(vector<int> &nums) {        // write your code here        vector<vector<int>> res;        vector<int> P;//P[i]表示第i个位置填的元素        vector<bool> visited(nums.size(),false);//保证同一个数不会被选多次        DFS(res,P,visited,nums,0);        return res;    }    void DFS(vector<vector<int>>& res,vector<int>& P,vector<bool>& visited,vector<int>& nums,int index){        if(index==nums.size()){//下标从0-n-1,index==n时则表示都完成了            res.push_back(P);            return;        }        //执行到这里,表示还没填完        for(int i=0;i<nums.size();++i){            if(!visited[i]){//第i个位置的数还没有用                P.push_back(nums[i]);                visited[i]=true;                DFS(res,P,visited,nums,index+1);//填下一个位置                //恢复                visited[i]=false;                P.pop_back();            }        }    }


第一次接触的话,可以借助画图的方法理解,index表示正在填的位置的下标,需要借助一个数组visited表示是否使用过了



由图中可以看出程序的流程:

1.由于循环一直是i=0,i<nums.size(),实际上每个节点下面都有3个节点,只是有的重复了,故用斜线划掉,为了简单,图中只画了一部分。这也正是visited数组的作用,避免了重复

2.程序刚进入时,i=0.index=0,第一个位置填了1,然后DFS进入index=1的那一层搜索,i=0,但是nums[0]已经用过了,故i++,i=1开始,第二个位置填了2..........以此类推,搜到最深处则存入res中,这正是深度优先遍历。可以看出程序是按图中从上到下,从左到右的顺序进行搜索,搜索出所有的情况

原创粉丝点击