全排列生成的迭代算法
2017-12-04 23:57
477 查看
Given a collection of distinct numbers, return all possible permutations.
目前web上大多数解法都是递归解法,基于“所有的递归算法都存在对应的迭代算法”的基本原理,本文提出了一种迭代算法,通过online judge。
测试代码如下。
用
目前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> >因此保留返回数据结构未进行更改。