您的位置:首页 > 其它

全排列生成的迭代算法

2017-12-04 23:57 477 查看
Given a collection of distinct numbers, return all possible permutations.

目前web上大多数解法都是递归解法,基于“所有的递归算法都存在对应的迭代算法”的基本原理,本文提出了一种迭代算法,通过online judge。

class Solution {
public:
static vector<vector<int> > permute(vector<int>& nums) {
vector<vector<int> > result;
if (nums.size() > 0)
{
vector<int> first_perm;
first_perm.push_back(nums[0]);
result.push_back(first_perm);
for (int index = 1; index < nums.size(); index++)
{
vector<vector<int> > update_result;
for (auto itResult = result.begin(); itResult != result.end(); itResult++)
{
vector<int> curPerm(*itResult);
int resultSize = curPerm.size();
for (int perm_index = 0; perm_index < resultSize; perm_index++)
{
vector<int> next_perm(curPerm);
next_perm.insert(next_perm.begin() + perm_index, nums[index]);
update_result.push_back(next_perm);
}
vector<int> last_perm(curPerm);
last_perm.push_back(nums[index]);
update_result.push_back(last_perm);
}
result.clear();
result = update_result;
}
}
return result;
}
};


测试代码如下。

#include <vector>
#include <cstdio>

using namespace std;

int main(int argc, char * * argv, char * * env)
{
char ch;
vector<int> nums = { 1, 2 , 3};
vector<vector<int> > result  = Solution::permute(nums);
for (auto itPerms = result.begin(); itPerms != result.end(); itPerms++)
{
for (auto itNum = itPerms->begin(); itNum != itPerms->end(); itNum++)
{
printf("%d ", *itNum);
}
printf("\n");
}
scanf("%c", &ch);
return ch;
}


vector<list<int> >
能够优化代码,但是鉴于leetcode上返回值为
vector<vector<int> >
因此保留返回数据结构未进行更改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  全排列 迭代算法