k、タイムアウトで終了する最初の時間
もう一度簡略化して、時間が長すぎます。一見、ソリューションは単純ではありません。
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;
}
}
}
};
カンター拡張が使用できます
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;
}