LeetCode(44)Permutations

来源:互联网 发布:mac 如何装office 免费 编辑:程序博客网 时间:2024/06/05 16:08

题目如下:

Given a collection of 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].


思考分析:

如果要生成[1,2,3]的所有排列。则先生成[1,2]的所有排列

[1,2]
[2,1]

然后
把3放入[1, 2]的所有可能位置: [1, 2]->[3, 1, 2], [1, 3, 2], [1, 2, 3]
把3放入[2, 1]的所有可能位置: [2, 1]->[3, 2, 1], [2, 3, 1], [2, 1, 3]

代码如下:

第一种, 递归:

class Solution { //56mspublic:    vector<vector<int> > permute(vector<int> &num) {        if (num.size() == 1){            vector<int> inner_result(1,num[0]);            vector<vector<int> > outer_result(1,inner_result);            return outer_result;        } else {            vector<int> sub_num(num.begin() + 1, num.end());            vector<vector<int> > outer_result = permute(sub_num);            vector<vector<int> > new_outer;            vector<int> new_inner;            for (int i = 0; i < outer_result.size(); ++i) {                for (int j = 0; j <= outer_result[i].size(); ++j) {                    new_inner = outer_result[i];                    new_inner.insert(new_inner.begin() + j, num[0]);                    new_outer.push_back(new_inner);                }            }            return new_outer;        }    }};



第二种, 迭代:

class Solution { //80mspublic:    vector<vector<int> > permute(vector<int> &num) {        vector<vector<int> > empty_vec_vec;        if(num.size()==0) return empty_vec_vec;        vector<int> inner_result(1, num[0]);        vector<vector<int> > outer_result(1, inner_result);        vector<vector<int> > new_outer_result;        for (int i = 1; i < num.size(); ++i ) {            for (int j = 0; j < outer_result.size(); ++j) {                for (int k = 0; k < inner_result.size(); ++k) {                    inner_result = outer_result[j];                    inner_result.insert(inner_result.begin() + k, num[i]);                     //node insert(argv1, argv2), argv1 is the iterator position.                    new_outer_result.push_back(inner_result);                }            }            outer_result = new_outer_result; //更新中间结果            new_outer_result.clear(); //清零!!        }        return outer_result;    }};



update: 2015-03-03

其实更简洁的写法是,经典的DFS的思路的写法。下面的这段说明转载自这里。


The idea of this classic problem is to use backtracking.
We want to get permutations, which is mainly about swap values in the list.
Consider:
a --> a
ab --> ab, ba
abc --> abc, acb, bac, bca, cab, cba.
...
where for the length of n, the permutations can be generated by
(1) Swap the 1st element with all the elements, including itself.
       (2) Then the 1st element is fixed, go to the next element.
       (3) Until the last element is fixed. Output.
It's more clear in the figure above. The key point is to make the big problem into smaller problem, here is how to convert the length n permutation into length n-1 permutation problem.

// 18msclass Solution {private:    void print1(vector<int> v) {        std::cout<<"--------1---------"<<std::endl;        for (int i = 0; i < v.size(); ++i)            std::cout<<v[i]<<"\t";        std::cout<<std::endl;    }    void print2(vector<vector<int> > v) {        std::cout<<"--------2---------"<<std::endl;        int count = 0;        for (int i = 0; i < v.size(); ++i) {            for (int j = 0; j < v[i].size(); ++j) {                std::cout<<v[i][j]<<"\t";                         }            count++;            std::cout<<std::endl;        }        std::cout<<"total = "<<count<<std::endl;    }        void swap(vector<int> &num, int i, int j) {        int temp = num[i];        num[i] = num[j];        num[j] = temp;    }        void dfs(vector<int> & num, int k, int n, vector<vector<int> >  & result) {        if (k == n){            result.push_back(num);        }else {            for (int i = k; i <= n; ++i) {  //i = k, i与包含自己在内的后面的所有元素进行交换。                swap(num, k, i);                dfs(num, k+1, n, result);                swap(num, k, i);            }        }    }    public:    vector<vector<int> > permute(vector<int> &num) {        vector<vector<int> > result;        dfs(num, 0, num.size() -1 , result);        print2(result);        return result;    }};



0 0