一、題目
給定一個非負整數?
numRows
,生成「楊輝三角」的前?numRows
?行。在「楊輝三角」中,每個數是它左上方和右上方的數的和。
示例 1:
輸入: numRows = 5 輸出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例?2:
輸入: numRows = 1 輸出: [[1]]提示:
1 <= numRows <= 30
二、源代碼
int** generate(int numRows, int* returnSize, int** returnColumnSizes) {int** c = malloc(numRows * sizeof(int*));*returnSize = numRows;*returnColumnSizes = malloc(numRows * sizeof(int));for (int i = 0; i < numRows; i++) {(*returnColumnSizes)[i] = i + 1;c[i] = malloc((i + 1) * sizeof(int));c[i][0] = c[i][i] = 1;for (int j = 1; j < i; j++) {// 左上方的數 + 正上方的數c[i][j] = c[i - 1][j - 1] + c[i - 1][j];}}return c;
}
三、解題思路
1.函數參數與返回值
int** generate(int numRows, int* returnSize, int** returnColumnSizes)
功能:生成包含 numRows 行的楊輝三角。
參數:
numRows:需要生成的楊輝三角的行數(輸入參數)。
returnSize:用于傳出結果的行數(輸出參數,最終值等于 numRows)。
returnColumnSizes:用于傳出每行的元素個數(輸出參數,是一個數組,其中 returnColumnSizes[i] 表示第 i 行的元素數)。
返回值:int** 類型(二維數組),存儲生成的楊輝三角。
2.核心邏輯解析
(1)分配二維數組空間(存儲楊輝三角)
int** c = malloc(numRows * sizeof(int*));
楊輝三角有 numRows 行,因此先為每行分配一個指針(int* 類型),存儲每行的首地址。c 是指向這些指針的指針(二維數組的首地址)。
(2)設置返回的行數
*returnSize = numRows;
通過 returnSize 指針告訴調用者:生成的楊輝三角有 numRows 行。
(3)分配每行的元素個數數組
*returnColumnSizes = malloc(numRows * sizeof(int));
楊輝三角的第 i 行(從 0 開始計數)有 i+1 個元素(例如第 0 行 1 個元素,第 1 行 2 個元素,以此類推)。
這里為存儲每行元素個數的數組分配空間(長度為 numRows)。
(4)填充每行數據
for (int i = 0; i < numRows; i++) {
????// 第i行有i+1個元素,記錄到returnColumnSizes中
????(*returnColumnSizes)[i] = i + 1;
????
????// 為第i行分配i+1個int的空間
????c[i] = malloc((i + 1) * sizeof(int));
????
????// 每行的第一個和最后一個元素都是1
????c[i][0] = c[i][i] = 1;
????
????// 填充每行中間的元素(j從1到i-1)
????for (int j = 1; j < i; j++) {
????????// 中間元素 = 上一行的左上角元素 + 上一行的正上方元素
????????c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
????}
}
外層循環 i 遍歷每一行(0 到 numRows-1)。
首先記錄第 i 行的元素個數為 i+1(存到 returnColumnSizes[i])。
為第 i 行分配 i+1 個 int 的空間(存儲該行的具體元素)。
楊輝三角的特性:每行第一個元素(j=0)和最后一個元素(j=i)都是 1,因此直接賦值為 1。
內層循環 j 遍歷每行的中間元素(1 到 i-1),這些元素的值等于上一行(i-1)中左側元素(j-1)和正上方元素(j)的和(核心規則)。
(5)返回結果
return c;
返回存儲楊輝三角的二維數組。
四、總結
這段代碼通過動態內存分配創建二維數組,結合楊輝三角的特性(首尾為 1,中間元素為上兩行之和),逐行填充數據,最終生成指定行數的楊輝三角,并通過輸出參數返回結果的結構信息(行數和每行元素數)。