leetcode之杨辉三角

leetcode之杨辉三角

2022/3/31

(题源力扣)

题目简述:

给定一个非负整数 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

还是python用的顺手啊(赞赏),,,(bushi

言归正传

如果只看题目原图
leetcode之杨辉三角_第1张图片

几乎不会让人有什么头绪,,
所以我们可以考虑到把杨辉三角写成类似下面这样的下三角形式,,

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
......

这个时候,我们就可以把杨辉三角的结构放到一个 n ∗ n n * n nn的矩阵(实际只用下三角区域,可以用遍历控制)中,并且很容易能总结出递推公式:

a j k = a j − 1 , k − 1 + a j − 1 , k a_{jk} = a_{j-1,k-1} + a_{j-1,k} ajk=aj1,k1+aj1,k

式子中, a j k a_{jk} ajk表示位于第j行第k列的元素。
要注意的是,这个公式需要 a j − 1 , k − 1 a_{j-1,k-1} aj1,k1以及 a j − 1 , k a_{j-1,k} aj1,k存在,即只在某个元素位于第一列及对角线以外的位置适用。

实际上,通过进一步观察,我们可以发现, a i i a_{ii} aii(对角线元素)以及 a m 1 a_{m1} am1(第一列的元素)都是1,正好对应了上文公式不适用的情况。

python代码如下:

class Solution(object):
    def generate(self, numRows):
        """
        :type numRows: int
        :rtype: List[List[int]]
        """
        res = []	# 输出的矩阵
        for i in range(numRows):
            res.append([])		# 添加行维度
        for j in range(numRows):
            for k in range(j+1):	# 注意范围,只要下三角,防止赋值次数错误
            	# 边缘元素赋值
                if k == 0:
                    res[j].append(1)	# 第一列元素
                elif k == j:
                    res[j].append(1)	# 对角线元素
                else:
                    res[j].append(res[j-1][k-1] + res[j-1][k])	# 中间元素递推公式
                    k += 1

        return res

你可能感兴趣的:(leetcode菜鸟刷题记,leetcode,python)