本来是用一个二位数组来写的,但是部分案例不通过。就去看了别人的,发现一个优秀写法:
只用一个一维数组,初值全为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;
}