标签:nbsp 步骤 bsp 全排列 mpi 迭代 过程 操作 输入
1. 题目分析
这道题求输入数组的全排列,并且数组中的所有数字都不同。
2. 思路:交换生成
例如:输入【1,2,3】
步骤一:生成【1】
步骤二:先将2插入[1]的后面,生成【1,2】,然后将"2"前面的数字依次和"2"进行交换,生成【2,1】
步骤三:分别对【1,2】和【2,1】进行第二步的操作:
【1,2】,插入3生成【1,2,3】,将"3"前面的数字依次和"3"进行交换,生成【3,2,1】,【1,3,2】
【2,1】,插入3生成【2,1,3】,将"3"前面的数字依次和"3"进行交换,生成【3,1,2】,【2,3,1】
此时,3为输入数组中的最后一个元素,所以输出结果:【1,2,3】,【3,2,1】,【1,3,2】,【2,1,3】,【3,1,2】,【2,3,1】
若3不为输入数组中的最后一个元素,则分别对上面的结果进行步骤3的操作。
上述过程可以用递归或者迭代实现:
递归代码(C++,12ms):
1 class Solution { 2 public: 3 vector<vector<int>> permute(vector<int>& nums) 4 { 5 vector<vector<int>> res; 6 if(0 == nums.size()) 7 return res; 8 vector<int> subres; 9 int start = 0; 10 recur(nums,res,subres,start); 11 return res; 12 } 13 void recur(vector<int>& nums,vector<vector<int>>& res,vector<int> subres,int next) 14 { 15 bool last = false; 16 subres.push_back(nums[next]); 17 if(next == nums.size()-1) 18 { 19 res.push_back(subres); 20 last = true; 21 } 22 else 23 { 24 recur(nums,res,subres,next+1); 25 } 26 for(int i=0;i<next;i++) 27 { 28 vector<int> temp(subres); 29 int tempint = temp[i]; 30 temp[i] = temp[next]; 31 temp[next] = tempint; 32 if(true == last) 33 res.push_back(temp); 34 else 35 recur(nums,res,temp,next+1); 36 } 37 } 38 };
46. Permutations -- 解题报告 -- C++
标签:nbsp 步骤 bsp 全排列 mpi 迭代 过程 操作 输入
原文地址:https://www.cnblogs.com/jingjingblog/p/9117779.html