60. Clasificación K

Inserte la descripción de la imagen aquí
La primera vez para terminar con k, tiempo de espera

Simplificado por segunda vez, el tiempo es demasiado largo. A primera vista, la solución no es simple.

class Solution {
public:
    int flag[10]={0};
    int mapp[10]={0,1,2,6,24,120,720,5040,40320,362880};
    string getPermutation(int n, int k) {
        string ans;
        string tep;
        int row_num=mapp[n]/n;
        int start=k/row_num+(k%row_num==0?0:1);
        k=k-(start-1)*row_num;
        dfs(ans,n,k,tep,start);
        return ans;
    }
    void dfs(string& ans,int n,int& k,string tep,int start){
        if(tep.size()==n){
            k--;
            if(k==0) ans=tep;
            return;
        }
        for(int i=start;i<=n;i++){
            if(flag[i]==0){
                flag[i]=1;
                dfs(ans,n,k,tep+to_string(i),1);
                flag[i]=0;
                if(!ans.empty()) return;
            }
        }
    }   
};

Se puede usar la expansión de Cantor

int factorial[10]={1,1,2,6,24,120,720,5040,40320,362880};
    string getPermutation(int n, int k) {
        string ans;
        k--;
        vector<char>num={'1','2','3','4','5','6','7','8','9'};
        for(int i=n;i>=1;i--){
            int a=k/factorial[i-1];
            k=k%factorial[i-1];
            ans.push_back(num[a]);
            num.erase(num.begin()+a);
        }
        return ans;
    }
161 artículos originales publicados · Me gusta 68 · Visitantes más de 20,000

Supongo que te gusta

Origin blog.csdn.net/qq_43179428/article/details/105175120
Recomendado
Clasificación