118. Pascal's Triangle
Given a non-negative integer numRows, generate the first numRows of Pascal's triangle.
In Pascal's triangle, each number is the sum of the two numbers directly above it.
Example:
Input: 5 Output: [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ]
解题思想:
将Pascal‘s Triangle看成是下三角(如下所示),通过二重循环对二维数组进行赋值。Pascal’s Triangle具有对称性,在处理时应加以利用。
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
/*
执行用时 : 0 ms, 在Pascal's Triangle的C提交中击败了100.00% 的用户
内存消耗 : 7.1 MB, 在Pascal's Triangle的C提交中击败了8.13% 的用户
*/
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** generate(int numRows, int* returnSize, int** returnColumnSizes){
//定义返回数组
int** returned = (int**)malloc(sizeof(int*)*numRows);
//定义返回数组每行的列数
*returnColumnSizes = (int*)malloc(sizeof(int)*numRows);
int i=0,j;
while(i<numRows){//按行处理
returned[i] = (int*)malloc(sizeof(int)*(i+1));//给每行分配空间
//第i行有i列,下面i是下标,所以加1
(*returnColumnSizes)[i]=i+1;
//每行首尾初始化为1
returned[i][0]=returned[i][i]=1;
j=1;
while(j<=i/2){//按列处理,对称原则只需处理i/2列
returned[i][j]=returned[i-1][j-1]+returned[i-1][j];
returned[i][i-j]=returned[i][j];//利用前后对称性质,直接赋值
//returned[i][i-j]=returned[i][j];或者
//或者returned[i][i-j]=returned[i-1][i-j]+returned[i-1][i-j-1];两者都可
j++;
}
i++;
}
*returnSize = numRows;
return returned;
}
后记:
- 要有将杨辉三角看成是下三角的思想。
- 对int** returned(返回数组)和*returnColumnSizes(返回列个数数组)两个数组的空间分配要清楚。
- 了解int* returnSize要使用时总是*returnSize,不然会出错。
- 利用好对称性,可以简化算法。如:returned[i][i-j]=returned[i][j];//利用前后对称性质,直接赋值
LeetCode 119. Pascal's Triangle II(杨辉三角II) -- c语言