美文网首页程序员
permutations(全排列)

permutations(全排列)

作者: 静水流深ylyang | 来源:发表于2019-01-03 16:39 被阅读0次

    题目描述

    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].

    题目大意

    给定一个数组集合,返回所有可能的排列。

    思路

    给的提示是分治+递归。

    分治:就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

    由实例可以看出来,全排列是有规律可循的:
    第一个排列是集合由小到大排列;
    第二个交换了最后两个数字;
    第三个交换了一二两个数字;
    第四个是在第三个的基础上交换了二三两个数字;
    ... ...

    代码

    #include<iostream>
    #include<vector>
    using namespace std;
    
    void permute_help(vector<vector<int> > &, vector<int> &, int);
    
    vector<vector<int> > permute(vector<int> &num)
    {
        vector<vector<int> > res;
        if(num.size() == 0)return res;
        permute_help(res, num, 0);
        return res;
    }
    void permute_help(vector<vector<int> > &res, vector<int> &num, int index)
    {
        if(index == num.size()-1)
        {
            res.push_back(num);
            return;
        }
        for(int i=index; i<num.size(); i++)
        {
            swap(num[i], num[index]);
            permute_help(res, num, index+1);
            swap(num[i], num[index]);
        }
    }
    int main()
    {
        vector<int> num;
    
        for(int i=1; i<=3; i++)
        {
            num.push_back(i);
        }
    
        vector<vector<int> > res = permute(num);
    
        for(int i=0; i<res.size(); i++)
        {
            for(int j=0; j<res[0].size(); j++)
            {
                cout << res[i][j]<<' ';
            }
            cout << endl;
        }
    
        return 0;
    }
    

    运行结果

    以上。

    相关文章

      网友评论

        本文标题:permutations(全排列)

        本文链接:https://www.haomeiwen.com/subject/hwfqrqtx.html