题意

给定一个整数k,返回第k小的组合数.

方法一(暴力方法)

我们直接计算杨辉三角。(这里用到了set,可以排除掉重复的结果)
图片说明
应该按照递推的方式,计算出大量的值,再进行排序,获得第k小的答案。

class Solution {
public:
    /**
     * 
     * @param k int整型 
     * @return int整型
     */
    int yh [5000][5000];
    int kthSamllest(int k) { 
        set<int> num;
        for (int i = 0;i <= 20;++ i) {
            for (int j = 0;j < i;++ j) {
                if (j == 0 || i == j) {
                    yh [i][j] = 1;
                } else {
                    yh [i][j] = yh [i - 1][j] + yh [i - 1][j - 1];
                }
                num.insert(yh [i][j]);
            }
        }
        int cnt = 0;
        for (auto &e:num) {
            ++cnt;
            if (cnt == k) {
                return e;
            }
        }
        return 0;
    }
};

因为图片说明 ,而我们所计算的组合数数量显然远小于k,更不用提去重后的数字数量了。
时间复杂度和空间复杂度都无比巨大。复杂度根据方法二的分析可得,为图片说明

方法二 (正解)

因为题目要求给出第k小的组合数,那么对于重复的数字不用考虑。
而我们知道杨辉三角中所有的数字都是正数,且有公式图片说明 ,所以1-k之间的k个数都可以取到。那么显然,第k小的数就是k。

class Solution {
public:
    /**
     * 
     * @param k int整型 
     * @return int整型
     */
    int kthSamllest(int k) { 
        return k;
    }
};

因为直接返回k,所以时间复杂度与空间复杂度都是图片说明