杨辉三角的问题:
Pascal’s triangle I
第一题,简单的输出杨辉三角,
Given numRows, generate the first numRows of Pascal’s triangle.
For example, given numRows = 5,
Return
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
至于杨辉三角的意义可以百度。
主要从数组的规律上考虑,可以看出首尾数字为1,中间的数字等于其上一行肩上的两个数字之和:
/**
* Return an array of arrays.
* The sizes of the arrays are returned as *columnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** generate(int numRows, int** columnSizes) {
int **ret = (int **)malloc(sizeof(int *)*numRows);
int *tmp = (int *)malloc(sizeof(int)*numRows);
for(int i=0;i<numRows;i++)
{
ret[i] = (int *)malloc(sizeof(int)*(i+1));
ret[i][0] = 1;
ret[i][i] = 1;
tmp[i] = i+1;
for(int j=1;j<i;j++)
ret[i][j] = ret[i-1][j-1]+ret[i-1][j];//肩上数字之和
}
*columnSizes = tmp;
return ret;
}
Pascal’s triangle II
Given an index k, return the kth row of the Pascal’s triangle.
For example, given k = 3,
Return [1,3,3,1].
Note:
Could you optimize your algorithm to use only O(k) extra space?
题目要求使用O(K)的额外空间复杂度,那么显然不能使用上面第一种的方法将其完全打印出来。那么就从某一行的数据来解决:
假设输入k=3,先将数组初始化为1,然后对除了首尾两个元素(如果存在的话,一定是1)之外的元素进行循环累加,如j=1时,ret[j] = ret[j]+ret[j-1],如此循环即可,代码如下:
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* getRow(int rowIndex, int* returnSize) {
int *ret = (int *)malloc(sizeof(int)*(rowIndex+1));
for(int i=0;i<=rowIndex;i++)
ret[i] = 1;
for(int i=1;i<rowIndex;i++)//rowIndex元素不用处理 因为是1
for(int j=i;j>0;j--)//0不用处理 因为是1
ret[j] = ret[j]+ret[j-1];
*returnSize = rowIndex+1;
return ret;
}