Permutations [Leetcode 解题报告]

来源:互联网 发布:protgresql和mysql 编辑:程序博客网 时间:2024/06/06 21:04

Given a collection of distinct numbers, return all possible permutations.
For example,

[1,2,3] have the following permutations:[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1].

关于这个题方法很多,我在这里挑了两种常用的:
一、递归实现,每次从现有的串中选择一个,对其他的进行递归全排列,最后和在一起就是最终的结果,这种方法最容易理解,代码如下:

vector<vector<int>> permute(vector<int>& num) {        int n=num.size();        vector<vector<int>> res;        if(n==1){            res.push_back(num);            return res;        }        else{             vector<int> copy;             vector<int> temp;             vector<vector<int>> post;             for(int i=0;i<n;i++){                 copy=num;                 copy.erase(copy.begin()+i);                 post=permute(copy);                 for(int j=0;j<post.size();j++){                     temp=post[j];                     temp.insert(temp.begin(),num[i]);                     res.push_back(temp);                 }             }             return res;        }    }

二、这种方法其实跟上面的很类似,但是稍快,可能是因为这种方法操作vector的次数少一些,主要思想是:递归进行n次,每次规定前K-1个元素,然后递归下面的n-k个元素,看代码更容易理解点,代码如下:

void perm(vector<vector<int>> &res,vector<int> &nums,int k){        if(k==nums.size()-1){            res.push_back(nums);            return;        }else{            perm(res,nums,k+1);            for(int i=k+1;i<nums.size();i++){                swap(nums[k],nums[i]);                perm(res,nums,k+1);                swap(nums[k],nums[i]);            }        }    }    vector<vector<int>> permute(vector<int>& nums) {        vector<vector<int>> res;        perm(res,nums,0);        return res;    }    void swap(int &a,int &b){        int c=a;        a=b;        b=c;    }
0 0
原创粉丝点击