题目:给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
我们的思路是开辟一个二维数组的空间,然后根据题目要求把数据填进去,返回该二维数组的地址;注意,在二维数组中的一维数组也要开辟空间;
int** generate(int numRows, int* returnSize, int** returnColumnSizes)
{
//开辟二维数组的空间,返回的空间
int** ret = (int**)malloc(sizeof(int*) * numRows);
//返回的二维数组的行数
*returnSize = numRows;
//开辟返回的二维数组的列数
*returnColumnSizes = (int*)malloc(sizeof(int) * numRows);
for (int i = 0; i < numRows; i++)
{
//为第i行开辟的空间大小
ret[i] = (int*)malloc(sizeof(int) * (i + 1));
//第i行数组的大小
(*returnColumnSizes)[i] = i + 1;
//首位置1
ret[i][0] = 1;
ret[i][i] = 1;
//除了首尾的位置等于上面两项之和
for (int j = 1; j < i; j++)
{
ret[i][j] = ret[i - 1][j - 1] + ret[i - 1][j];
}
}
//返回二维数组
return ret;
}
题目:给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
输入: rowIndex = 3
输出 : [1, 3, 3, 1]
这里的思路跟上面的相似,不同的是,这题不用返回该二维数组,只是返回某一行,所以只需要开辟每一行的空间即可,最后返回符合题意的行的地址即可;
int* getRow(int rowIndex, int* returnSize)
{
//返回行数
*returnSize = rowIndex + 1;
//创建一个二维数组
int* ret[rowIndex + 1];
int i, j;
for (i = 0; i < rowIndex + 1; i++)
{
//为第i行开辟空间
ret[i] = (int*)malloc(sizeof(int) * (i + 1));
//首尾置1
ret[i][0] = 1;
ret[i][i] = 1;
for (j = 1; j < i; j++)
{
ret[i][j] = ret[i - 1][j - 1] + ret[i - 1][j];
}
}
//返回相应的行
return ret[rowIndex];
}