Leetcode-60:第k个排列

    xiaoxiao2022-07-07  147

    个人思路总结:

    C++递归解答,根据k和n的值确定string res中每一位的取值。 我们知道排列的每一位上都有n种选择,而每一种选择都有(n-1)!种排列方式。因此我们要从左往右依次确认每一位上应该取什么值。判断的方式就是每一位各种选择的排列总数之和是否大于k,一旦大于k,就可以确定此时的那个数字可以作为当前位的数字了。然后删除这个数字,进行下一次递归。

    代码如下:

    class Solution { public: string getPermutation(int n, int k) { string res; vector<int> tmp; for(int i=1;i<=n;i++) tmp.push_back(i); //记住是从1开始的 dfs(res,tmp,n,k); return res; } void dfs(string& res, vector<int>& tmp, int n, int k) { if(tmp.empty()) return; int step = multiy(n-1); int count = 0, s = step; while(k>s) { s += step; count++; } res += to_string(tmp[count]); tmp.erase(tmp.begin()+count); dfs(res,tmp,n-1,k-count*step); } int multiy(int n) //阶乘的计算方式(递归) { if(n<=1) return 1; else return n*multiy(n-1); } };
    最新回复(0)