【每日一题】【LeetCode】【第十一天】【Python】杨辉三角

解决之路= =

题目描述

在这里插入图片描述

测试案例(部分)

在这里插入图片描述

第一次

杨辉三角感觉还是挺经典的代码题目?之前大一学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到倒了的程度)

附件

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值