全排列涉及循环和递归。递归由递归关系式和递归出口组成。
在每一次循环中,可以从左到右确定一个数字,然后通过递归让剩下k-1个数进行全排列。
也可以从右到左,先确定最后一个数字,然后把前面k-1个数字进行全排列。
Leetcode
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路一:确定第一个数字,对后k-1个数字进行全排列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| class Solution { public: vector<vector<int>> res; void perm(vector<int>nums, int p, int q) { if(q == p) { res.push_back(nums); return; } else { for(int i = p; i < q; i++) { int temp = nums[i]; nums[i] = nums[p]; nums[p] = temp; perm(nums,p+1,q); temp = nums[i]; nums[i] = nums[p]; nums[p] = temp; } } } vector<vector<int>> permute(vector<int>& nums) { int len = nums.size(); perm(nums,0,len); return res; } };
|
思路二:确定最后一个数字,前k-1个数字进行全排列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Solution { public: vector<vector<int>> res; void perm(vector<int>nums, int q) { if(q == 1) { res.push_back(nums); return; } else { for(int i = 0; i < q; i++) { int temp = nums[i]; nums[i] = nums[q-1]; nums[q-1] = temp; perm(nums,q-1); temp = nums[i]; nums[i] = nums[q-1]; nums[q-1] = temp; } } } vector<vector<int>> permute(vector<int>& nums) { int len = nums.size(); perm(nums,len); return res; } };
|