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
言归正传
如果只看题目原图
 
几乎不会让人有什么头绪,,
 所以我们可以考虑到把杨辉三角写成类似下面这样的下三角形式,,
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
......
 
这个时候,我们就可以把杨辉三角的结构放到一个 n ∗ n n * n n∗n的矩阵(实际只用下三角区域,可以用遍历控制)中,并且很容易能总结出递推公式:
a j k = a j − 1 , k − 1 + a j − 1 , k a_{jk} = a_{j-1,k-1} + a_{j-1,k} ajk=aj−1,k−1+aj−1,k
式子中,
    
     
      
       
        
         a
        
        
         
          j
         
         
          k
         
        
       
      
      
       a_{jk}
      
     
    ajk表示位于第j行第k列的元素。
 要注意的是,这个公式需要
    
     
      
       
        
         a
        
        
         
          j
         
         
          −
         
         
          1
         
         
          ,
         
         
          k
         
         
          −
         
         
          1
         
        
       
      
      
       a_{j-1,k-1}
      
     
    aj−1,k−1以及
    
     
      
       
        
         a
        
        
         
          j
         
         
          −
         
         
          1
         
         
          ,
         
         
          k
         
        
       
      
      
       a_{j-1,k}
      
     
    aj−1,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










