解决之路= =
题目描述
测试案例(部分)
第一次
杨辉三角感觉还是挺经典的代码题目?之前大一学C语言好像写过一次。
不过,自己当时就不会写,这次自己先试试能不能想出解决方案。
输入数字是几,那就要输出几行,第i行有i个元素,规律会是会了,但每一行的元素应当怎么算出来呢?这个是个关键点。
看图很好看每行元素应该怎么算出来,但是在代码中,一个列表毕竟还是一个线性结构,不像图中,是一个金字塔的一个结构,所以在正常思路到代码逻辑的转换还是有难度的。
不过,展示图中金字塔的这种,很容易想到二叉树这个数据结构,然后代码中我们是一个列表展示出来的,所以联想到了二叉树的顺序存储。对于顺序存储的二叉树找父子结点,是有规律的。
把二叉树的结点由上到下,从左到右吗、,从1开始一一编号,就可以观察到第
i
个结点的父节点编号是i/2
(默认向下取整),左孩子结点编号是2i
,右孩子结点编号是2i+1
。
但是我们这里的图中不完全是二叉树,每层结点数对不上,但是我们可以类比这个思路,来推出规律。我们还是由上到下,从左到右吗、,从1开始一一编号,但发现没有规律。稍改一下思路,既然最终需要我们返回的是嵌套列表,那我们把每层的结点从左到右,从0开始编号,就可以看出一点端倪了。
可以发现,除开边缘以外,下一层的第i
个元素=上一层的第一个i
个元素+第i-1
个元素。
那么代码就有思路了
然后我们就可以完善一下(因为写好的是函数形式,完善的话,就保留函数形式了)
函数放在外面的话,提交会报错找不到nextRow这个函数,所以只能放里面,当一个嵌套函数来用。
class Solution(object):
def generate(self, numRows):
def nextRow(up_list):
n = len(up_list)
next_list = [1 for i in range(n + 1)]
for i in range(1, n):
next_list[i] = up_list[i] + up_list[i-1]
return next_list
rows = []
temp = [1]
for i in range(numRows):
rows.append(temp)
temp = nextRow(temp)
return rows
测试正确,提交,成功!牛!耗时也不多,击败了90%的人,一步到位!
杂谈
这次还真是一次成功,精彩的还是推演规律的过程,结果也出人意料的好。
但自己还是好奇别人怎么解决的,看到一个“牛逼”的解决方案。。。。
只能说9(6到倒了的程度)