给定一个非负索引 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;
}
而官方的代码,这是有够整洁的:
LL
是long 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就不能过,无解。