这个一般面试问你,你写出一种但是,可能会问你劣势的地方
其实还有个左右对称的问题
奇数行两边对称,偶数自己跟自己对称
对称可以知道,有了一边就知道另外一边,中间的值需要算
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)的问题
列表是由顺序的,不可以无限追加,大的列表在使用的时候,加法考虑合适不合适