118. Pascal's Triangle [easy] (Python)

题目链接

https://leetcode.com/problems/pascals-triangle/

题目原文

Given numRows, generate the first numRows of Pascal’s triangle.

For example, given numRows = 5,
Return

[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]

题目翻译

给定数字的行数numRows,生成帕斯卡三角形的前numRows行。比如,给定numRows=5,返回:

[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]

思路方法

首先,你要知道帕斯卡三角形的规律:
它是一个三角形矩阵,其顶端第0行是 1;第1行两个1,这两个1是由他们上头左右两数之和 (不在三角形内的数视为0)。依此类推产生第2行:0+1=1;1+1=2;1+0=1。第3行:0+1=1;1+2=3;2+1=3;1+0=1。循此产生后面的行。

思路一

直接按照上面的规律,每一行的数据都是新生成的。这里要注意判断不在三角形内的数要视为0。

代码

class Solution(object):
    def generate(self, numRows):
        """ :type numRows: int :rtype: List[List[int]] """
        if numRows == 0:
            return []
        res = [[1]]
        for i in range(1, numRows):
            res.append([])
            for j in range(i+1):
                res[i].append((res[i-1][j-1] if j>0 else 0) + (res[i-1][j] if j<i else 0))
        return res

思路二

实际上,每一行的第一和最后一个数都是1,考虑到这一点可以稍微减少计算量,同时避免了对额外情况的判断和处理。

代码

class Solution(object):
    def generate(self, numRows):
        """ :type numRows: int :rtype: List[List[int]] """
        res = []
        for i in range(0, numRows):
            res.append([1]*(i+1))
            for j in range(1, i):
                res[i][j] = res[i-1][j-1] + res[i-1][j]
        return res

思路三

利用python的map函数可以比较精简的实现该算法。这里用到一个小小的trick,即:每一行的结果可以由上一行和上一行的偏移相加得到。例如:

 1 3 3 1 0 + 0 1 3 3 1 = 1 4 6 4 1 

代码

class Solution(object):
    def generate(self, numRows):
        """ :type numRows: int :rtype: List[List[int]] """
        res = [[1]]
        for i in range(1, numRows):
            res += [map(lambda x, y: x+y, res[-1] + [0], [0] + res[-1])]
        return res[:numRows]

PS: 新手刷LeetCode,新手写博客,写错了或者写的不清楚还请帮忙指出,谢谢!
转载请注明:http://blog.csdn.net/coder_orz/article/details/51589254

    原文作者:杨辉三角问题
    原文地址: https://blog.csdn.net/coder_orz/article/details/51589254
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞