给定一个序列,序列中的任意一个数字均可以做为全排列的最后一位。而后,其他位置元素的肯定即是剩余元素的一个全排列,也就是一个子问题。数组
例子中 [1, 2, 3] 的全排列,最后一位能够是 1 或者 2 或者 3。若是最后一位是 3,前两位即是 [1, 2] 的全排列。code
咱们用递归来实现,变量 k 一开始为序列的长度,每次求解子问题的时候减一。递归终止条件为 k=1,一个元素的全排列只有它本身。blog
class Solution { public: vector<vector<int>> result; vector<vector<int>> permute(vector<int>& nums) { int n = nums.size(); Generate_Premutations(nums, n, n); return result; } void Generate_Premutations(vector<int>& nums, int n, int k) { if (k == 1) { result.push_back(nums); return; } // 任何一个数字均可以做为全排列的最后一位 for (int i = 0; i < k; i++) { int temp = nums[i]; nums[i] = nums[k-1]; nums[k-1] = temp; // 最后一位数字肯定后,余下的是一个全排列的子问题 Generate_Premutations(nums, n, k-1); // 恢复原数组 temp = nums[i]; nums[i] = nums[k-1]; nums[k-1] = temp; } } };
获取更多精彩,请关注「seniusen」!递归