前言:剑指offer刷题系列
问题:
给定一个非负整数 *numRows
,*生成「杨辉三角」的前 numRows
行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
思路:
杨辉三角是小学就学过的一种方法,看着还挺熟悉,所以没有花费很多时间理解(学名叫做 帕斯卡三角形 的数学模型),帕斯卡三角形是一个由数字构成的三角形,其中每个数字是肩膀上方两个数字之和,一直做金字塔下延。
这个函数接受一个名为 numRows
的整数作为输入,并返回一个二维列表,表示「杨辉三角」的前 numRows
行。下面是详细的思考过程。
- 首先,定义一个名为
Solution
的 Python 类。这个类将包含一个方法generate
,它接受一个整数参数numRows
,用于指定要生成的行数。方法的返回值将是一个二维列表,其中包含了帕斯卡三角形模型的前numRows
行。 - 在
generate
方法中,创建一个空列表triangle
,用于存储生成的三角形。 - 使用外层循环
for i in range(numRows)
来控制生成的行数。在每次循环中,创建一个空列表row
,用于存储当前行的元素。 - 在内层循环
for j in range(1, i)
中,通过访问上一行的元素来计算当前行的元素值。具体地说,将当前元素设置为上一行中相邻两个元素之和:row[j] = triangle[i - 1][j - 1] + triangle[i - 1][j]
。 - 完成内层循环后,将当前行
row
添加到triangle
列表中。 - 外层循环结束后,返回存储了帕斯卡三角形模型的二维列表
triangle
。
基于上述思考,代码如下:
class Solution:
def generate(self, numRows: int) -> List[List[int]]:
triangle = []
for i in range(numRows):
row = [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
执行结果如下图:
学到的知识点:
学会如何使用帕斯卡三角形模型生成特定行数的三角形。
今天突然发现之前参加的一个活动快要结束了,但是我的任务还没有做完,要抓紧做一下任务,不然自己的心血啊都要泡汤了。