杨辉三角

题目

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
原题链接

leetcode一些二维数组的参数解释

本题本身没有什么难度,是一道简单题,但是在对二维数组分配内存时,如果不熟悉很容易弄错。先对刷题时常见的二维数组的参数进行一下总结。
对于本题,函数形式如下:

int** generate(int numRows, int* returnSize, int** returnColumnSizes)
  • returnColumnSizes是一个一维数组的地址的地址。(地址即指针),return-Column-Sizes,类似于returnSize,是一个“返回值”,返回的信息是二维数组的列数。

  • returnSize中要返回的信息是二维数组的行数。

因为要对传入的参数进行读写,而非只是读取。如果传入为int,int*,函数并没有对原来的数组进行任何操作;

returnColumnSizes	        //是一维数组的地址的地址
* returnColumnSizes		    //是一维数组的地址
(* returnColumnSizes)[i]	//是一维数组的i个元素

解题思路

杨辉三角每行数字个数依次递增,并且第[0][i]和[i][i]个元素都为1,利用此特性可以先更新第[0][i]和[i][i]个元素为1,接着再对中间元素进行处理,ans[i][j] = ans[i - 1][j - 1] + ans[i - 1][j],j从1开始小于i时结束,正好处理了所有中间数字。
代码如下:

int** generate(int numRows, int* returnSize, int** returnColumnSizes){
     int** ans = malloc(sizeof(int*) * numRows);
     *returnSize = numRows;
     *returnColumnSizes = malloc(sizeof(int) * numRows);
     for(int i = 0; i < numRows; ++i){
         ans[i] = malloc(sizeof(int) * (i + 1));
         (*returnColumnSizes)[i] = i + 1;
         ans[i][0] = ans[i][i] = 1;
         for(int j = 1; j < i; ++j){
             ans[i][j] = ans[i - 1][j - 1] + ans[i - 1][j];
         }
     }
     return ans;
}
posted @ 2020-12-06 11:01  爱吃_🍓  阅读(93)  评论(0)    收藏  举报