46. Permutations -- 解题报告 -- C++

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

猜你喜欢

转载自www.cnblogs.com/jingjingblog/p/9117779.html