class Solution {
public :
void backtrack ( vector< vector< int >> & res, vector< int > & output, int first, int len) {
if ( first == len) {
res. emplace_back ( output) ;
return ;
}
for ( int i = first; i < len; i++ ) {
swap ( output[ i] , output[ first] ) ;
backtrack ( res, output, first + 1 , len) ;
swap ( output[ i] , output[ first] ) ;
}
}
vector< vector< int >> permute ( vector< int > & nums) {
vector< vector< int >> res;
backtrack ( res, nums, 0 , ( int ) nums. size ( ) ) ;
return res;
}
} ;
class Solution {
public :
void recursive ( vector< vector< int >> & res, vector< int > & visited, vector< int > & output, vector< int > nums, int m, int k) {
if ( k == m) {
res. emplace_back ( output) ;
return ;
}
for ( int i = 0 ; i < m; i++ ) {
if ( ! visited[ i] ) {
output. emplace_back ( nums[ i] ) ;
visited[ i] = 1 ;
recursive ( res, visited, output, nums, m, k + 1 ) ;
output. pop_back ( ) ;
visited[ i] = 0 ;
}
}
}
vector< vector< int >> permute ( vector< int > & nums) {
vector< int > visited;
vector< vector< int >> res;
vector< int > output;
int m = nums. size ( ) ;
visited. resize ( m) ;
for ( int i = 0 ; i < m; i++ ) {
visited[ i] = 0 ;
}
recursive ( res, visited, output, nums, m, 0 ) ;
return res;
}
} ;