118. 杨辉三角
一、算法逻辑(逐步思路)
❓ 题目目标:
给定一个整数 numRows
,生成一个包含 numRows
行的杨辉三角(即帕斯卡三角形)。
✅ 杨辉三角性质回顾:
- 第
i
行有i+1
个元素(从 0 开始计数); - 每行的两端都是 1;
- 中间位置的值满足:
triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j]
✅ 思路解析:
- 初始化二维列表:
c = [[1] * (i+1) for i in range(numRows)]
-
- 每一行先用 1 填满;
- 因为杨辉三角每行的开头和结尾总是 1,所以先整体初始化为全 1 是合理的。
- 填充中间项:
-
- 从第 3 行(下标为 2)开始遍历;
- 每行的第一个和最后一个元素保持为 1,不变;
- 对中间的每个位置 j,用上一行的
j-1
和j
相加得到当前值。
- 返回结果:
-
- 构造完成后,返回整个二维列表
c
。
- 构造完成后,返回整个二维列表
二、算法核心点
✅ 核心思想:利用杨辉三角的递推性质构造二维数组
- 每一项的值等于其上一行相邻两项之和;
- 初始化为全 1 是为了保留两边边界值;
- 只需填补中间项,逻辑清晰、空间节省。
class Solution:
def generate(self, numRows: int) -> List[List[int]]:
c = [[1] * (i+1) for i in range(numRows)]
for i in range(2,numRows):
for j in range(1,i):
c[i][j] = c[i-1][j]+c[i-1][j-1]
return c
三、复杂度分析
- 时间复杂度:O(n²)
-
- 外层循环最多
n
次,内层最多n
次,总体是二维数组填充,O(n²)。
- 外层循环最多
- 空间复杂度:O(n²)
-
- 返回的是一个包含
n
行的二维列表,存储所有值需要 O(n²) 空间。
- 返回的是一个包含
总结表:
维度 | 内容 |
✅ 思路逻辑 | 先初始化每行为全 1,然后递推中间项: |
✅ 核心技巧 | 初始化为全 1,边界值不变,仅填中间项 |
✅ 时间复杂度 | O(n²) |
✅ 空间复杂度 | O(n²) |