leetcode60 (arreglo kth: recursividad matemática)

Dado el conjunto [1,2,3, ..., n], todos sus elementos tienen n! Permutaciones.
Enumere todas las permutaciones en orden de tamaño y márquelas una por una. Cuando n = 3, todas las permutaciones son las siguientes:
“123”
“132”
“213”
“231”
“312”
“321”
Dados n y k, regrese al primero k permutaciones.

Entrada: n = 3, k = 3
Salida: "213"

Solución: comience con el arreglo más pequeño, aumente gradualmente el arreglo y encuentre el k-ésimo arreglo más pequeño. Necesitamos expandir gradualmente el tamaño de la matriz desde el último número hacia adelante para encontrar las primeras n cadenas en orden ascendente, por ejemplo: la primera está en orden ascendente y los dos primeros son los dos últimos números en orden ascendente ( El orden de los números antes de los últimos 2 números es ascendente), los primeros 6 números son el orden ascendente de los últimos 3 números (los números antes de los últimos 3 números están en orden ascendente) ......

Inserte la descripción de la imagen aquí
Podemos acercarnos gradualmente a la k-ésima permutación de acuerdo con la ley que se muestra en el diagrama (si k es mayor que 2 y menor o igual que 4, el cuarto número de la k-ésima permutación debe ser 5)

class Solution {
    
    
    //动态字符串记录结果
    private final StringBuilder res=new StringBuilder();
    public String getPermutation(int n, int k) {
    
    
          StringBuilder order=new StringBuilder();
          for(int i=1;i<=n;i++){
    
    
              order.append(i);
          }
          getNum(order,k);
          return res.toString();
    }
    private void getNum(StringBuilder order,int k){
    
    
        int len=order.length();
        if(k==0)
            return;
        int pos=0;
        int preTotal=0;
        int numPos=0;
        for(int i=1;i<=len;i++) {
    
    
            int total=0;
            int base=1;
            //找到第k小的排列
            for(int m=1;m<=i-1;m++){
    
    
                base*=m;
            }
            for (int j = 1; j <= i; j++) {
    
    
                total+=base;
                if(total>=k){
    
    
                    pos=len-i;
                    numPos=pos+j-1;
                    preTotal=total-base;
                    res.append(order.substring(0,pos)).append(order.charAt(numPos));
                    order.delete(0,pos).delete(numPos-pos,numPos-pos+1);
                    getNum(order,k-preTotal);
                    return;
                }
            }
        }
    }
}

Supongo que te gusta

Origin blog.csdn.net/CY2333333/article/details/108425261
Recomendado
Clasificación