60. Permutation Sequence

本文介绍了一种高效算法来求解给定整数n和k时的第k个排列序列,采用数学方法而非暴力枚举,显著提升了计算效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

The set [1,2,3,…,n] contains a total of n! unique permutations.

By listing and labeling all of the permutations in order,
We get the following sequence (ie, for n = 3):

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"

Given n and k, return the kth permutation sequence.

Note: Given n will be between 1 and 9 inclusive.

代码:

class Solution {
public:
    //TLE
	/*string getPermutation(int n, int k) {
		vector<int> nums;
		vector<int> vans; 
		vector<int> temp;
		vector<bool> used(n);
		for (int i = 0; i < n; i++) nums.push_back(i + 1);
		helper(vans, temp, n, nums, used, k);
		string ans;
		for (int i = 0; i < nums.size(); i++) ans += (char)('0' + vans[i]);
		return ans;
	}
	void helper(vector<int>& vans, vector<int>& temp, int left, vector<int>& nums, vector<bool>& used, int& k){ 
         
        if(left == 0){ 
            
            k--;
            if(k == 0) vans = temp;
            return; 
        } 
        for(int i = 0; i < nums.size(); i++){ 
            if(!used[i]){ 
                temp.push_back(nums[i]); 
                used[i] = true; 
                helper(vans, temp, left - 1, nums, used, k); 
                temp.pop_back(); 
                used[i] = false; 
            } 
        } 
    }*/
    string getPermutation(int n, int k) {
        int fa[10] = {1};
        for(int i = 1; i <= 9; i++){
            
            fa[i] = i * fa[i - 1];
        }
        string res;
        vector<int> nums = {1, 2, 3, 4, 5, 6, 7, 8 ,9};//这句话 重要。,避免了对数字 +1, -1的问题。
        for(int i = n; i > 0; i--){
            int quotients = (k - 1) / fa[i - 1];
            res.push_back('0' + nums[quotients]);//注意: 这里不是res.push_back('0' + nums[quotients + 1]);因为数组是从0开始算的
            nums.erase(nums.begin() + quotients);
            k = k - quotients * fa[i - 1];
            //k = k % fa[n - 1];//注意: 这里不能用k % x,因为上面用的是 k / x.
        }
        return res;
    }
    
    
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值