第k个排列

题目描述

给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
1、“123”
2、“132”
3、“213”
4、“231”
5、“312”
6、“321”
给定 n 和 k,返回第 k 个排列。
说明:
给定 n 的范围是 [1, 9]。
给定 k 的范围是[1, n!]。

示例

示例一:
输入: n = 3, k = 3
输出: "213"

示例二:
输入: n = 4, k = 9
输出: "2314"

心路历程

感觉有点只可意会不可言传…,就是从高位往下决定排列的哪一个。先把n个数字存入一个vector中,然后再看这一次的能减去几个(n-1)!,然后能减去的个数就是当下这一位的。然后再把这个元素从vector中pop出去

代码

class Solution {
public:
    string getPermutation(int n, int k){
        vector<int> nums; // 存放有哪些数
        string ans = "";
        for(int i=1; i<n+1; i++){
            nums.push_back(i);
        }
        for(int i=0; i<n; i++){
            int factorial = 1;
            for(int j=2; j<nums.size(); j++)
                factorial = factorial * j;
            int countNum = 0;
            // 计算把数组中的第几个pop出去
            while(k-factorial>0){
                k = k-factorial;
                countNum++;
            }
            int choose_num = nums[countNum];
            nums.erase(nums.begin()+countNum);//删除第一个元素
            // leetcode这里是to_string, CLION是toString
            ans = ans + to_string(choose_num);
        }
        return ans;
    }
};

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutation-sequence

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值