118.楊輝三角
輸入: 5
輸出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
算法一(自己寫(xiě)的):
def generate(self, numRows: int) -> List[List[int]]:
if numRows == 0: #第0行為空
return []
if numRows == 1:
return [[1]] #返回第1行
a = [[1],[1,1]] #前兩行
for i in range(3,numRows+1): #從第三行開(kāi)始進(jìn)行循環(huán)
b = [1] #每一行頭一個(gè)數(shù)均為1
for j in range(2,i): #需要加入i-2個(gè)數(shù)字
b.append(a[i-2][j-2]+a[i-2][j-1]) #第i行的第一個(gè)數(shù)為上一行前兩個(gè)數(shù)相加
b.append(1) #最后一個(gè)數(shù)仍為1
a.append(b) #將第i行加入數(shù)列
return a
分析:該算法的語(yǔ)句較多舱权,不夠簡(jiǎn)潔美觀矗晃。
算法二
def generate(self, numRows: int) -> List[List[int]]:
l = [[1]]
for i in range(1,numRows): #循環(huán)numRows-1次
l.append(list(map(lambda x,y:x+y, [0]+r[-1], r[-1]+[0])))
return l[:numRows] #如果numRows為0,則返回[]
分析:該算法利用了楊輝三角下一行等于上一行錯(cuò)格相加的特性宴倍。
高手們都使用了lambda张症、map等函數(shù)進(jìn)行編寫(xiě),寫(xiě)出來(lái)的算法簡(jiǎn)潔美觀鸵贬。下面進(jìn)行從map等基礎(chǔ)函數(shù)開(kāi)始介紹俗他。
lambda函數(shù)
lambda是匿名函數(shù),通常是在想用一個(gè)簡(jiǎn)單的函數(shù)恭理,但是又不想def一個(gè)新函數(shù)的情況下使用拯辙,表達(dá)式為:
lambda 形參列表 : 函數(shù)返回值表達(dá)式語(yǔ)句
>>>f = lambda x,y: x+y
>>>f(1,2)
3
zip()函數(shù)
zip函數(shù)是Python的一個(gè)內(nèi)建函數(shù),可以接受一系列可迭代的對(duì)象作為參數(shù)颜价,將對(duì)象打包成一個(gè)個(gè)元組(tuple)涯保,然后返回由元組組成的列表(list)。若傳入?yún)?shù)的長(zhǎng)度不等周伦,則以最短長(zhǎng)度的對(duì)象為最終list的長(zhǎng)度夕春。
>>> b = [4,5,6]
>>> c = [7,8,9]
>>> d = [4,5]
>>>list(zip(a,b))
[(4,7), (5,8), (6,9)]
>>>list(zip(a,b,c))
[(4,7,4),(5,8,5)]
利用*號(hào)操作符,可以將list unzip(解壓)专挪,下面是將矩陣行列互換
>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>>list(map(list, zip(*a)))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
map()函數(shù)
map(func,seq[,seq2…])
map函數(shù)將func用于seq中的每一個(gè)元素及志,并用一個(gè)列表將結(jié)果返回片排。如果func為空,則作用等同于zip()速侈。
>>>list(map(lambda x:x%2), range(4)))
[0,1,0,1]
>>>list(map(lambda x,y:x+y), [1,2],[3,4]))
[4,6]
>>>list(map(lambda x,y: (x+y, x*y), [1,2,3],[4,5,6]))
[(5,4),(7,10),(9,18)]
reduce函數(shù)
reduce(func,seq[,init])
reduce()函數(shù)即為化簡(jiǎn)率寡,前兩個(gè)元素進(jìn)行func,結(jié)果與下一個(gè)元素再次進(jìn)行func倚搬。
reduce(func,[1,2,3]) = func(func(1,2),3)
其中init可選:如存在init冶共,則init作為第一個(gè)元素。使用reduce函數(shù)需要從functool中調(diào)用每界。
>>>from functools import reduce
>>>reduce(lambda x,y:x+y, [1,2,3,4,5]) #階乘
120
>>>reduce(lambda x,y:x+y, [1,2,3,4,5], 2) #二倍階乘
240
filter()函數(shù)
filter()函數(shù)用于過(guò)濾序列捅僵。函數(shù)接受一個(gè)func與數(shù)列,函數(shù)一次作用于元素眨层,根據(jù)布爾返回值決定是否返回元素庙楚。True則返回,F(xiàn)alse則不返回趴樱。
>>>list(filter(lambda x:x%2 == 1, [1,2,3,4,5]))
[1,3,5]