本来是用一个二位数组来写的,但是部分案例不通过。就去看了别人的,发现一个优秀写法:
只用一个一维数组,初值全为1,因为在求每行倒数第二个元素时会用到上一层的最后一个元素。想输出第k行就把n设为k(k从0开始)。然后i从2循环到num,表示每行的数的形成,每次大循环从倒数第二个数arr[i-]开始改直到a[1],=正上方的数加左上方的数。一个循环就是一行,然后下一个循环就在上个循环的基础上改动,只保留最后一行,前面的只是作为垫脚石。如果从前往后改,则后面的数会被前面已改过的数影响而发生错误。
int* getRow(int num, int* returnSize ) { int* arr = (int*)malloc(sizeof(int) * (num+1)); int i = 0; for(i = 0; i<=num; i++){ arr[i] = 1; } //长度为num+1的返回数组初值全设为1 *returnSize = num+1; //返回数组的长度 if(num== 0 || num == 1) return arr; //特殊情况优先处理 for(i = 2; i<= num; ++i){ //从第二行开始改到最后一行 for(int j = i-1; j>0; --j) //从倒数第二个数开始改,改到arr[1] arr[j] = arr[j-1] + arr[j]; //正上方的数加上左上方的数 } return arr; }