初次写博客,一堆烂代码奉上

*原题:https://leetcode-cn.com/problems/permutation-sequence/description/
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
“123”
“132”
“213”
“231”
“312”
“321”
给定 n 和 k,返回第 k 个排列。
说明:
给定 n 的范围是 [1, 9]。
给定 k 的范围是[1, n!]。
示例 1:
输入: n = 3, k = 3
输出: “213”
示例 2:
输入: n = 4, k = 9
输出: “2314”*

拿到这题最容易让人想到的方法就是:
1.先求出所有的全排列(方法自写);
2.再将这些全排列转化为int;
3.排序找到第k大元素(或者改写快速排序找第k大元素,但是并没有什么本质上的改变);

但是很无奈,当n为9的时候 排序的时间是巨大的,而且给这些全排列存储起来花费的空间也非常巨大。。。显然是一种很差的方法。

通过分析 1—–>n的全排列我们可以发现:
1.第一个数字是从1—–>n排下去的(nums【】里的元素依次排下去的);
2. 以第一个数字划分为组(zu)的话 一共有 (n-1)!个;
3. 需要找的第k个全排列 变成了 相对于除去第一个数字而言的第k-(zu - 1)*zu_size个;

典型的递归算法!!!
**举个简单的例子 n=4 ,k=15
1.以 1、2、3、4开头的 共4组 每组6个((4-1)!)全排列
第k=15个在第 3组(首数字3),同时可以锁定当前元素3为要加入str元素,
2.加入后 nums={1,2,4} k=(15-12)=3; 以1,2,4开头的 又分为3组 每组2个((3-1)!)全排列第3个元素在第2组首数字为 2……….**
以下是烂代码:

class Solution {
public:
int jc(int n){
        if (n <= 1) return n;
        else return n*jc(n - 1);
    }
    vector<int> jc_vector_table(){
        vector<int>m;
        m.push_back(0);
        for (int i = 1; i <= 9; i++)
            m.push_back(jc(i));
        return m;
    }
    string digui_qiu(vector<int> &nums, vector<int> &total, int k){
        string str;
        if (k <= 1){
            for (int i = 1; i <= nums.size() - 1; i++)
                str += to_string(nums[i]);
            return str;
        }
        int n = nums.size() - 1;
        int zu_size = total[n - 1];
        int zu = k / zu_size;
        if (k%zu_size != 0) zu++;
        string tmp = to_string(nums[zu]);
        str += tmp;
        vector<int>::iterator p = nums.begin() + zu;
        nums.erase(p);
        k = k-(zu - 1)*zu_size;
        str+=digui_qiu(nums, total, k);
        return str;
    }
    string getPermutation(int n, int k) {
        string str;
        vector<vector<int>> m;
        vector<int> nums;
        vector<int> total;
        for (int i = 0; i <= n; i++) nums.push_back(i);
        total=jc_vector_table();
        str = digui_qiu(nums, total, k);
        cout << str << endl;
        return str;
    }
    };

猜你喜欢

转载自blog.csdn.net/qq_42203013/article/details/82534195