1. 程式人生 > >permutations(全排列)

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<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;
}

執行結果

在這裡插入圖片描述

以上。