class Solution {
public:
vector<vector<int> > permute(vector<int> &num) {
vector<vector<int> > res;
permuteDFS(num, 0, res);
return res;
}
void permuteDFS(vector<int> &num, int start, vector<vector<int> > &res) {
if (start >= num.size()) res.push_back(num);
for (int i = start; i < num.size(); ++i) {
swap(num[start], num[i]);
permuteDFS(num, start + 1, res);
swap(num[start], num[i]);
}
}
};
对于第k层节点来说,就是交换固定了前面 k-1 位,然后分别 swap(k,k), swap(k, k+1) , swap(k, k+2) ...
例如上图中的第三层,固定了第一位(即2),然后分别交换第1,1位,1,2位,1,3位

class Solution {
private:
vector<vector<int>> res;
vector<bool> used;
void generatePermutation( const vector<int>& nums, int index, vector<int>& p){
if( index == nums.size() ){
res.push_back(p);
return;
}
for( int i = 0 ; i < nums.size() ; i ++ )
if( !used[i] ){
used[i] = true;
p.push_back( nums[i] );
generatePermutation(nums, index+1, p );
p.pop_back();
used[i] = false;
}
return;
}
public:
vector<vector<int>> permute(vector<int>& nums) {
res.clear();
if( nums.size() == 0 )
return res;
used = vector<bool>(nums.size(), false);
vector<int> p;
generatePermutation( nums, 0, p );
return res;
}
};
test
#include <iostream>
#include <vector>
using namespace std;
class Solution {
vector<vector<int> > ret;
int N;
public:
void perm(vector<int> &num, int i){
if( i == N){
cout<<"Add:";
for(auto i :num){
cout<<i<<" ";
}
cout<<endl;
ret.push_back(num);
}
for(int j = i; j < N; j++){
swap(num[i], num[j]);
perm(num, i + 1);
swap(num[j], num[i]);
}
}
vector<vector<int> > permute(vector<int> &num) {
N = num.size();
ret.clear();
perm(num, 0);
return ret;
}
};
int main() {
int nums[] = {1, 2, 3};
vector<int> vec(nums, nums + sizeof(nums)/sizeof(int) );
vector< vector<int> > res = Solution().permute(vec);
for( int i = 0 ; i < res.size() ; i ++ ){
for( int j = 0 ; j < res[i].size() ; j ++ )
cout<<res[i][j]<<" ";
cout<<endl;
}
}
i=0,j=0
Swap:1 1
i=1,j=1
Swap:2 2
i=2,j=2
Swap:3 3
i=3
Add:1 2 3
i=2,j=2
SwapBack:3 3
i=1,j=1
SwapBack:2 2
i=1,j=2
Swap:2 3
Swap:2 2
Add:1 3 2
SwapBack:2 2
SwapBack:3 2
SwapBack:1 1
Swap:1 2
Swap:1 1
Swap:3 3
Add:2 1 3
SwapBack:3 3
SwapBack:1 1
Swap:1 3
Swap:1 1
Add:2 3 1
SwapBack:1 1
SwapBack:3 1
SwapBack:2 1
Swap:1 3
Swap:2 2
Swap:1 1
Add:3 2 1
SwapBack:1 1
SwapBack:2 2
Swap:2 1
Swap:2 2
Add:3 1 2
SwapBack:2 2
SwapBack:1 2
SwapBack:3 1
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2