119.杨辉三角||

7 篇文章 1 订阅

给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3
输出: [1,3,3,1]
进阶:
你可以优化你的算法到 O(k) 空间复杂度吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pascals-triangle-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

杨辉三角 数学规律:
在这里插入图片描述
在这里插入图片描述
思路
除去去当前行的值等于上一行的值之和这个思路。(时间复杂度是行数的平方)

用以上规律-数学公式直接实现的话,时间复杂度就能达到O(行数)。直接利用公式对数组赋值。

自己提交的代码,除了数据太大超出long类型范围

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

 //实现阶乘
long long int J(int i){
    int j;
    long long int k=1;
    for(j=1;j<=i;j++)
        k=1LL*k*j; //long不够用,还是超出了
    return(k);
}
long long int C(int i,int j){  /*定义组合数*/
    long long int k;
    k=1LL*J(j)/(J(i)*J(j-i));
    return(k);
}
int* getRow(int rowIndex, int* returnSize){
    *returnSize = rowIndex+1;
    //动态申请返回数组,第k行有k+1个元素
    int *ret_array = (int *)malloc((rowIndex + 1) * sizeof(int));
    //第rowIndex行的内容放在数组里
    for(int n=0;n<=rowIndex;n++)
        *(ret_array + n) =1LL * C(n,rowIndex);
    return ret_array;
}

而官方的代码,这是有够整洁的:
LLlong long int的意思,就是长长整型,C99标准的新东西。

int* getRow(int rowIndex, int* returnSize) {
    *returnSize = rowIndex + 1;
    //动态申请分配空间
    int* row = malloc(sizeof(int) * (*returnSize));
    //考虑每一行杨辉三角当前的数和前一个数的组合关系。
    row[0] = 1;
    for (int i = 1; i <= rowIndex; ++i) {
        row[i] = 1LL * row[i - 1] * (rowIndex - i + 1) / i;
    }
    return row;
}

为什么官方LL就可以过,我的LL就不能过,无解。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

asjodnobfy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值