permutations(全排列)

题目描述

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
#include
using namespace std;

void permute_help(vector > &, vector &, int);

vector > permute(vector &num)
{
    vector > res;
    if(num.size() == 0)return res;
    permute_help(res, num, 0);
    return res;
}
void permute_help(vector > &res, vector &num, int index)
{
    if(index == num.size()-1)
    {
        res.push_back(num);
        return;
    }
    for(int i=index; i num;

    for(int i=1; i<=3; i++)
    {
        num.push_back(i);
    }

    vector > res = permute(num);

    for(int i=0; i

运行结果

permutations(全排列)_第1张图片

以上。

你可能感兴趣的:(算法,数据结构,分治,每天一道算法题)