60. Permutation Sequence

题目链接

https://leetcode.com/problems/permutation-sequence/

解题思路

n个数要求第k个排列,可以先根据k在n个数里面先确定第一个数并更新k,之后问题就变成了在剩下的n-1数里面找更新后的第k个排列的子问题。

代码

class Solution {
public:
    string getPermutation(int n, int k) {
        vector<int> fac(n + 1, 0);
        vector<int> nums(n);

        //fac[i]表示i的阶乘 num[i]是i+1
        fac[0] = 1;
        for (int i = 1; i <= n; ++i) {
            fac[i] = fac[i - 1] * i;
            nums[i - 1] = i;
        }

        string ans;
        while (!nums.empty()) {
            //在nums数组里确定取哪个数
            int &t = fac[nums.size() - 1];
            //i表示取的nums数组里的第几个数,从1开始
            int i = k / t;
            if (k % t != 0 || i == 0) {
                i++;
            }
            //更新k
            k = k - (i - 1) * t;
            ans.push_back((char) (nums[i - 1] + '0'));
            nums.erase(nums.begin() + i - 1);
        }
        return ans;
    }
};

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容