楊輝三角-list實現(優化)
阿新 • • 發佈:2017-09-24
代碼優化思路
計算楊輝三角前6行(升級版),list實現
值如下: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1],[1,5,10,10,5,1]]
思路:
上一個實現的思路,下一行的數字是基於上一行的數字求得而來,那麽則只需要使用兩 個內存空間,分別來保存這兩行數字.一個保存上一行的數字,另一行則保存求得的下一 行數字.一輪循環後,新生成的下一行變成了舊行,新行清空重新計算並填充.
優化思路:
直接開辟一個足夠大的內存空間,在此內存空間中來模擬舊行和新行的關系,如直接將新行的內容覆蓋舊行的內容. 優點: 內存空間的消耗減少,時間復雜度不比上一個實現差.
代碼實現:
l1=[1]*6 # 開辟一個長度為6的列表 print(l1[:1]) print(l1[:2]) for i in range(2,6): a=[1] # 定義及重置 for j in range(1,i//2+1): a.append(l1[j]) # 將用於計算的數附加至此列表 if len(a)>2: # 列表長度大於2時,進行元素處理 a[0]=a[1] a[1]=a[2] a.remove(a[2]) l1[j]=a[0]+a[1] if i!=2j: l1[i-j]=l1[j] print(l1[:i+1]) # 根據切片,只打印所需部分
實現想法:
上一行與下一行的關系,無非就是兩個數相加所得結果是下一行的某一值.在同一列表 中操作,需要防止生成的新值將用於計算的舊值覆蓋.因此需要將用於計算的值保存下 來. 我使用的是用列表保存,而且此列表只需要兩個值即可,當列表長度超過了3,則代表第 一個用於計算的值已經使用完,便用後面的兩個值覆蓋掉.
更優方案:
每次計算前將要被覆蓋的值保存至一個變量中,在下次計算時使用此變量和下一個索引 的值進行相加同樣可以求出此結果. 優點: 此處變量比列表效率更高 註意: 這個變量要在原值修改之前保存 在下一輪的計算之前,變量的值沒有改變
代碼實現:
l1=[1]*6 # 開辟長度為6的列表 print(l1[:1]) # 1,2行做特殊行處理 print(l1[:2]) for i in range(2,6): a=1 for j in range(1,i//2+1): # 將求下一行值分為兩步 val = l1[j]+a # 第一步求值 a = l1[j] # 將原值先保存至a l1[j] = val # 第二步賦值 if i!=2j: l1[i-j]=l1[j] print(l1[:i+1])
實現想法:
將求值的過程分成兩步,先把a和索引對應的值的和保存至變量val中,再把即將要被覆 蓋的值保存至a,最後在將val的值覆蓋至事先保存的變量位置.
本文出自 “12064120” 博客,請務必保留此出處http://12074120.blog.51cto.com/12064120/1968205
楊輝三角-list實現(優化)