LeetCode 热题 100 118. 杨辉三角
LeetCode 热题 100 | 118. 杨辉三角
大家好,今天我们来解决一道经典的算法题——杨辉三角。这道题在 LeetCode 上被标记为简单难度,要求生成杨辉三角的前 numRows
行。杨辉三角是一个经典的组合数学问题,每一行的数字都是其正上方和正左上方的数字之和。下面我将详细讲解解题思路,并附上 Python 代码实现。
问题描述
给定一个非负整数 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
解题思路
核心思想
-
逐行生成:
- 每一行的第一个和最后一个数字都是
1
。 - 中间的数字可以通过上一行的相邻两个数字相加得到。
- 每一行的第一个和最后一个数字都是
-
动态规划:
- 使用一个二维列表
triangle
来存储杨辉三角的每一行。 - 每一行的生成依赖于上一行的值。
- 使用一个二维列表
Python代码实现
def generate(numRows):# 初始化杨辉三角triangle = []for i in range(numRows):# 每一行的第一个和最后一个数字都是 1row = [1] * (i + 1)# 计算中间的数字for j in range(1, i):row[j] = triangle[i - 1][j - 1] + triangle[i - 1][j]# 将当前行加入杨辉三角triangle.append(row)return triangle# 测试示例
numRows1 = 5
numRows2 = 1result1 = generate(numRows1)
result2 = generate(numRows2)print(result1) # 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
print(result2) # 输出: [[1]]
代码解析
-
初始化杨辉三角:
- 使用一个二维列表
triangle
来存储每一行。
- 使用一个二维列表
-
逐行生成:
- 每一行的第一个和最后一个数字都是
1
。 - 中间的数字通过上一行的相邻两个数字相加得到。
- 每一行的第一个和最后一个数字都是
-
动态规划:
- 每一行的生成依赖于上一行的值,因此我们逐行构建杨辉三角。
复杂度分析
- 时间复杂度:O(numRows²),其中
numRows
是杨辉三角的行数。我们需要逐行生成每一行的数字。 - 空间复杂度:O(numRows²),用于存储杨辉三角的每一行。
示例运行
示例 1
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2
输入: numRows = 1
输出: [[1]]
总结
通过逐行生成的方法,我们可以高效地构建杨辉三角。这种方法直观且易于实现,适合大多数场景。希望这篇题解对大家有所帮助,如果有任何问题,欢迎在评论区留言讨论!
关注我,获取更多算法题解和编程技巧!