题目
题源
代码
码源
class Solution {
public List< List< Integer> > res = new ArrayList < > ( ) ;
public int count = 0 ;
public int locate_k;
public String getPermutation ( int n, int k) {
int [ ] sequence = new int [ n] ;
for ( int i = 0 ; i < n; i++ )
sequence[ i] = i+ 1 ;
if ( k == 1 ) return toStr ( sequence) ;
int i_n = 1 ;
for ( int i = n- 1 ; i >= 1 ; i-- )
i_n *= i;
while ( locate_k < k)
locate_k += i_n;
locate_k /= i_n;
count = k - ( locate_k- 1 ) * i_n - 1 ;
List< Integer> path = new ArrayList < > ( ) ;
path. add ( sequence[ locate_k- 1 ] ) ;
backtrack ( sequence, path) ;
return toStr ( res. get ( 0 ) ) ;
}
private void backtrack ( int [ ] sequence, List< Integer> path) {
if ( path. size ( ) == sequence. length)
{
if ( count == 0 )
res. add ( new ArrayList < > ( path) ) ;
else
count-- ;
return ;
}
for ( int i = 0 ; i < sequence. length; i++ ) {
if ( ! path. contains ( sequence[ i] ) )
{
path. add ( sequence[ i] ) ;
backtrack ( sequence, path) ;
path. remove ( path. size ( ) - 1 ) ;
}
}
}
private String toStr ( List< Integer> path) {
StringBuilder sb = new StringBuilder ( ) ;
for ( int i = 0 ; i < path. size ( ) ; i++ )
sb. append ( path. get ( i) ) ;
return sb. toString ( ) ;
}
private static String toStr ( int [ ] sequence) {
StringBuilder sb = new StringBuilder ( ) ;
for ( int i = 0 ; i < sequence. length; i++ )
sb. append ( sequence[ i] ) ;
return sb. toString ( ) ;
}
}