給定一個序列,序列中的任意一個數字均可以做爲全排列的最後一位。而後,其他位置元素的肯定即是剩餘元素的一個全排列,也就是一個子問題。數組
例子中 [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」!遞歸