Leetcode 46. Permutation 全排列
阿新 • • 發佈:2018-12-17
解決思路:
排列:從n個元素中任取m個元素,並按照一定的順序進行排列,稱為排列;
全排列:當n==m時,稱為全排列;
比如:集合{ 1,2,3}的全排列為:
{ 1 2 3}
{ 1 3 2 }
{ 2 1 3 }
{ 2 3 1 }
{ 3 2 1 }
{ 3 1 2 }
我們可以將這個排列問題畫成圖形表示,即排列列舉樹,比如下圖為{1,2,3}的排列列舉樹,此樹和我們這裡介紹的演算法完全一致;
演算法思路:
(1)n個元素的全排列=(n-1個元素的全排列)+(另一個元素作為字首);
(2)出口:如果只有一個元素的全排列,則說明已經排完,則輸出陣列;
(3)不斷將每個元素放作第一個元素,然後將這個元素作為字首,並將其餘元素繼續全排列,等到出口,出口出去後還需要還原陣列;
class Solution { public: vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> result; generate(nums, result, 0, nums.size() - 1); return result; } void generate(vector<int>& nums, vector<vector<int>> &result, int begin, int end) { if(begin == end) //如果已經到了最後一個元素,全排列只有自己,故返回 { result.push_back(nums); return; } else { //不斷交換元素進行全排列 for(int i = begin; i <= end; i++) { swap(nums[begin], nums[i]); generate(nums, result, begin + 1, end); //對numns[begin + 1, end]進行全排列 swap(nums[begin], nums[i]); } } } };