您的位置:首页 > 其它

[leetcode] permutations 排列

2014-08-07 17:07 429 查看
写了两个,一个是直接的递归实现:

class Solution {
public:

void swap(vector<int> &num,int left,int right)
{
num[left] = num[left]^num[right];
num[right] = num[left]^num[right];
num[left] = num[left]^num[right];
}

void permuteHelp(vector<int> &num,int fix,vector< vector<int> > &result)
{
if(fix==num.size()-1)
{
result.push_back(num);
return;
}
permuteHelp(num,fix+1,result);
for(int i=fix+1;i<num.size();i++)
{
swap(num,i,fix);
permuteHelp(num,fix+1,result);
swap(num,i,fix);
}
}

vector<vector<int> > permute(vector<int> &num) {
vector< vector<int> > result;
if (num.size()<1)
return result;
if(num.size()<2)
result.push_back(num);
else
permuteHelp(num,0,result);
return result;
}
};


另外一个是通过类似STL 的 next_permutation 函数方法实现:

下面链接是 STL 的 next_permutation 函数 描述:
http://www.cnblogs.com/Azhu/articles/3897586.html
按字典左起从小到达顺序给出当前序列的下一个排序,适用于序列中有重复元素的情况,函数的过程是:

1.右起寻找相邻的两数,满足next<next1

2.右起寻找第一个大于next的数,记为mid

3.交换 mext 与mid

4.逆序next1 (包括next1)到右末尾

class Solution{
public:

int factorial(int n)
{
return n<2?1:factorial(n-1)*n;
}

void next_per(vector<int> & num)
{
vector<int>::iterator first,last,next,next1,mid;
first = num.begin();
last = num.end();
next = last;
if(first==--next||first==last)
return ;
while(1)
{
next1=next--;
if(*next<*next1)
{
mid = last;
while(!(*next<*--mid));
iter_swap(next,mid);
reverse(next1,last);
return ;
}
if(next==first)
{
reverse(first,last);
return ;
}
}
}

vector< vector<int> > permute(vector<int> &num)
{
vector< vector<int> > result;
if(num.size()<1)
return result;
sort(num.begin(),num.end());
result.push_back(num);
for(int i=1;i<factorial(num.size());i++)
{
next_per(num);
result.push_back(num);
}
return result;
}
};


main函数:

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
vector<int> num;
int a = 2;
for(int i=0;i<a;i++)
num.push_back(i);
Solution solution;
vector< vector<int> > result;
result = solution.permute(num);
for(int id = 0;id<result.size();id++)
{
for(int i=0;i<a;i++)
cout<<result[id][i]<<' ';
cout<<endl;
}
cout<<result.size()<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: