题意:
  在所有不同的组合数中,求出第
小的组合数。 
 解法一(暴力枚举,set判重,不可AC)
  我们首先观察杨辉三角的一部分 
   我们可以直接枚举出杨辉三角中
行中的所有数字,然后利用set数据结构来进行判重,最后返回set中第
个数字即可。 
   具体的: 
       我们已知
,故对于第
行,我们只需要枚举第
个数字即可 
   代码: 
 class Solution {
public:
    unordered_map<int,int> fac;//记忆化搜索,存储n!的值
    int get_fac(int n){//计算阶乘
        if(n==0)return 1;
        if(fac.find(n)!=fac.end())return fac[n];
        //return fac[n]=n*get_fac(n-1);
        //如果爆int了直接返回0
        int t=get_fac(n-1);
        if(t==0||INT_MAX/t<n)return fac[n]=0;
        return fac[n]=t*n;
    }
    int C(int n,int m){//组合数
        int x=get_fac(n);
        if(x<=0)return 0;//如果爆int了,直接返回0
        //n! 不会爆int,下面肯定不会爆int
        int y=get_fac(m);
        x/=y;
        y=get_fac(n-m);
        x/=y;
        return x;
    }
    int kthSamllest(int k) {
        set<int> s;
        for(int i=0;i<=k;i++){
            for(int j=0;j<=i/2;j++){//根据C(i,j)=C(i,i-j),故只需要枚举到一半即可
                int x=C(i,j);
                if(x==0)continue;
                s.insert(x);
            }
        }
        return *s.lower_bound(k);//返回第k个数字
    }
}; 时间复杂度:  空间复杂度:
,我们set中需要存储
级别个数的数字,
中需要存储
个数字用于保存阶乘值,故总的空间复杂度为
 
 解法二(数学分析)
  我们知道
,而由于组合数都是整数,故第
小的数字即为
 
   所以直接返回
即可 
   代码: 
 class Solution {
public:
    int kthSamllest(int k) {
        return k;
    }
}; 时间复杂度:  空间复杂度:
,程序中我们只用到了一个整型变量,故空间复杂度为
 

京公网安备 11010502036488号