求全排列。
1. 无重复元素
Given a collection of distinct 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]
.
* The algroithm - Take each element in array to the first place.
* For example:
* 0) initalization
* pos = 0
* [1, 2, 3]
* 1) take each element into the first place,
* pos = 1
* [1, 2, 3] ==> [2, 1, 3] , [3, 1, 2]
* then we have total 3 answers
* [1, 2, 3], [2, 1, 3] , [3, 1, 2]
* 2) take each element into the "first place" -- pos
* pos = 2
* [1, 2, 3] ==> [1, 3, 2]
* [2, 1, 3] ==> [2, 3, 1]
* [3, 1, 2] ==> [3, 2, 1]
* then we have total 6 answers
* [1, 2, 3], [2, 1, 3] , [3, 1, 2], [1, 3, 2], [2, 3, 1], [3, 2, 1]
* 3) pos = 3 which greater than length of array, return.
vector<vector<int>> permute(vector<int>& nums) { int n = nums.size(), l, i, j, k; vector<vector<int>> ans; ans.push_back(nums); for(k = 0; k < n-1; k++) { l = ans.size(); for(i = 0; i < l; i++) { for(j = 1; k+j < n; j++) { vector<int> v = ans[i]; swap(v[k], v[k+j]); ans.push_back(v); } } } return ans; }
2. 有重复元素
// To deal with the duplication number, we need do those modifications:
// 1) sort the array [pos..n].
// 2) skip the same number.
vector<vector<int>> permuteUnique(vector<int>& nums) { int n = nums.size(), l, i, j, k; vector<vector<int>> ans; ans.push_back(nums); for(k = 0; k < n-1; k++) { l = ans.size(); for(i = 0; i < l; i++) { sort(ans[i].begin()+k, ans[i].end()); for(j = 1; k+j < n; j++) { vector<int> v = ans[i]; if(v[k+j] == v[k+j-1]) continue; swap(v[k], v[k+j]); ans.push_back(v); } } } return ans; }