Permutation
问题描述:
Given a collection of numbers, return all possible permutations.
For example,[1,2,3]
have the following permutations:[1,2,3]
, [1,3,2]
, [2,1,3]
, [2,3,1]
, [3,1,2]
, and [3,2,1]
.
C++ STL中提供了next_permutation()函数,在OJ中可以很容易的实现,下面直接实现了STL 中next_permutation()函数
1 #include <vector> 2 #include <algorithm> //next_permutaion,iter_swap,reverse 3 using std::vector; 4 5 namespace ns { 6 template <class BidirectionalIterator> 7 bool next_permutation (BidirectionalIterator first, 8 BidirectionalIterator last) 9 { 10 if(first == last) return false; //empty 11 12 BidirectionalIterator i = last; 13 if((--i)==first) return false; //just one element 14 15 while(i != first) 16 { 17 auto t = i; 18 --i; 19 if(*i < *t) 20 { 21 auto j = last; 22 while(!(*--j > *i)); 23 iter_swap(i,j); 24 reverse(t, last); 25 return true; 26 } 27 } 28 reverse(first, last); 29 return false; 30 } 31 } 32 33 class Solution { 34 public: 35 vector<vector<int>> permute(vector<int>& nums) { 36 sort(nums.begin(), nums.end()); 37 vector<vector<int>> res; 38 do{ 39 res.push_back(nums); 40 }while(ns::next_permutation(nums.begin(), nums.end())); 41 return res; 42 } 43 }; 44 45 int main() 46 { 47 vector<int> v{1,2,3}; 48 vector<vector<int>> res; 49 Solution s; 50 res = s.permute(v); 51 52 return 0; 53 }
方法二:递归实现
1 #include <vector> 2 #include <algorithm> 3 #include <iostream> 4 using std::vector; 5 6 class Solution { 7 public: 8 vector<vector<int>> permute(vector<int>& nums) { 9 sort(nums.begin(), nums.end()); 10 vector<vector<int>> res; 11 vector<int> v; 12 dfs(nums,v,res); 13 return res; 14 } 15 private: 16 void dfs(vector<int>& nums,vector<int>& v,vector<vector<int>>& res) 17 { 18 if(v.size() == nums.size()) 19 { 20 res.push_back(v); 21 return; 22 } 23 for(auto i : nums) 24 { 25 auto it = find(v.begin(),v.end(),i); 26 if(it == v.end()) 27 { 28 v.push_back(i); 29 dfs(nums,v,res); 30 v.pop_back(); 31 } 32 } 33 } 34 }; 35 36 int main() 37 { 38 vector<int> v{1,2,3}; 39 vector<vector<int>> res; 40 Solution s; 41 res = s.permute(v); 42 for (int i = 0; i < res.size(); ++i) 43 { 44 for(int j=0;j<res[i].size();j++) 45 { 46 cout << res[i][j]; 47 } 48 cout << endl; 49 } 50 return 0; 51 }