2019/09/17 03-杨辉三角对称解法和单行列表解法

在这里插入图片描述
这个一般面试问你,你写出一种但是,可能会问你劣势的地方
其实还有个左右对称的问题
奇数行两边对称,偶数自己跟自己对称
对称可以知道,有了一边就知道另外一边,中间的值需要算
1其实是可以省略的
在这里插入图片描述
之前我们对列表使用的都是append方法
1.先算一半,另外一半折射出来(折射出来其实还需要遍历)
2.两头一起添加,这样就不使用append方法
在这里插入图片描述
使用对称来做
第几行有几个就是i+1个元素
找到一半,就是除以2取整
在这里插入图片描述
可以这样,杨辉三角N行有N个数字,可以先把列表创建出来,然后填充,比如1001在这里插入图片描述在这里插入图片描述
j循环之后,可以被重新赋值在这里插入图片描述
可以算出来
在这里插入图片描述
也可以简化,无论是1还是0都是要被覆盖的在这里插入图片描述
全是1,中间被覆盖掉
在这里插入图片描述
i ==1 (索引)的时候,中间不计算,得0
i ==2 的时候,中间计算一次 1
i ==3 ,计算2次 1
i == 4 ,计算3次 2
i == 5 ,计算4次 2

在这里插入图片描述在这里插入图片描述
i=2,有中点
i=3,中点找不到,就什么事都不需要做 了

=在这里插入图片描述
第4行需要算到6这个位置在这里插入图片描述
需要解决有中点和无中点在这里插入图片描述在这里插入图片描述
append的方式进度慢
直接把中间的1替换,要比append速度快很多
在这里插入图片描述
写复杂的也是先搭个架子不断的试

那么下一个目标就是空间复杂度进一步降低在这里插入图片描述在这里插入图片描述
第一行留着,开始计算第二行,第二行计算后,把第一行丢弃,做第三行,把第二行丢弃
先放4个1在这里插入图片描述
第三方能否得到这两个数相加的来
在这里插入图片描述
**从开头取三个,字符串切片,前包后不包
**
头去
如果省略代表前面是0,表示索引0取到多少
在这里插入图片描述
row先定义好一行有几个在这里插入图片描述
但是我们是需要进行计算的
先推算2行的
在这里插入图片描述
再推算3行的在这里插入图片描述
再试试4行的,发现就出问题了,需要进行修改在这里插入图片描述
都错了在这里插入图片描述
4出问题,就需要修改
试算一下2进来计算的情况,就出现了问题
在这里插入图片描述
i!=2j的条件再这里可就有些不合理
现在试试不用对称看看能否解决问题
i//2只有2和3能进来
在这里插入图片描述
需要引入两个参数,需要可变的
n-2代表 row[-j-2]这个2也是需要变的

在这里插入图片描述
列表的1永远不动,这个7是1+6来的,如果直接写7,6就被覆盖掉了,21就算不出来了,7+15就等于22了,就需要先把6给挪出去
在这里插入图片描述在这里插入图片描述在这里插入图片描述
i=3,上一回row[j]=索引为1的值(1,2,1),就是2
n-i,就是偏移的量

在这里插入图片描述
用一个列表来解决就是空间复杂度比较小在这里插入图片描述
在这里插入图片描述在这里插入图片描述
使用列表的时候,方式有很多,要么慢慢变化,要么一次性把要的空间开辟了
但如果列表一开始进来不清楚,那就只能要一个增加一个
杨辉三角好再用多少个很清楚

如果有很多值保存,是一次性开辟(适合定长,或者极限的),还是一次次追加
如果用1行不要,重新再new,这样如果数据很大,那内存可能就不够用了,gc回收
如果你一百万数据,要追加,可能空间够,但是不连续,gc就需去规整

很大的数据可以分批,比如一万条放到列表里,一次次迭代处理,处理好,列表可以不要,可以再拿1000行过来处理

列表在内存中是必须连续的,但是查询比链表快

列表的特点,比如你查人的编号,你就需要把列表迭代一遍,查里面的内容,是非常吃力的O(n)的问题
列表是由顺序的,不可以无限追加,大的列表在使用的时候,加法考虑合适不合适

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值