package com.interview.leetcode.backtracing;
import com.interview.utils.ConsoleWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Created_By: stefanie
* Date: 14-11-24
* Time: 下午3:20
*/
public class Permutation {
static class KPermuation{
List<List<Integer>> sols;
public List<List<Integer>> permute(int[] num, int K) {
sols = new ArrayList<>();
List<Integer> current = new ArrayList<Integer>();
boolean[] used = new boolean[num.length];
Arrays.sort(num);
permute(num, current, K, used);
return sols;
}
public void permute(int[] num, List<Integer> current, int K, boolean[] used){
if(current.size() == K){
sols.add(new ArrayList<Integer>(current));
return;
}
for(int i = 0; i < num.length; i++){
if(used[i] == true) continue;
used[i] = true;
current.add(num[i]);
//de-dup
boolean hasDup = false;
for(int j = i; j > 0 && num[j - 1] == num[j]; j--){
if(used[j - 1] == false) {
hasDup = true;
break;
}
}
if(!hasDup) permute(num, current, K, used);
current.remove(current.size() - 1);
used[i] = false;
}
}
}
static class PermuationSequence{
/**
* scan from right to left, find the min number in the right that larger than current element,
* if exist, switch it with current, and sort the element in the right.
* @param num
*/
public void nextPermutation(int[] num) {
for(int i = num.length - 2; i >= 0; i--){
int min = -1;
for(int j = num.length - 1; j > i; j--){
if(num[j] > num[i] && (min == -1 || num[j] < num[min])) min = j;
}
if(min != -1){
int temp = num[i];
num[i] = num[min];
num[min] = temp;
Arrays.sort(num, i + 1, num.length);
return;
}
}
Arrays.sort(num);
}
public String getPermutation(int n, int k) {
int[] factors = factors(n);
k--;
k = k % factors[n];
StringBuilder options = new StringBuilder("123456789");
StringBuilder result = new StringBuilder();
while(n > 0){
int index = k / factors[n - 1];
char ch = options.charAt(index);
options.deleteCharAt(index);
result.append(ch);
k = k - factors[n - 1] * index;
n--;
}
return result.toString();
}
public int[] factors(int n){
int[] factors = new int[n + 1];
factors[0] = 1;
for(int i = 1; i <= n; i++) factors[i] = factors[i - 1] * i;
return factors;
}
public static void main(String[] args){
PermuationSequence sequence = new PermuationSequence();
// System.out.println(sequence.getPermutation(3, 1));
// System.out.println(sequence.getPermutation(3, 2));
// System.out.println(sequence.getPermutation(3, 3));
int[] num = new int[]{1,3,2};
sequence.nextPermutation(num);
ConsoleWriter.printIntArray(num);
}
}
}