Rumah > Soal Jawab > teks badan
class LongestIncreasingSubsequence:
def getLIS(self, A, n):
# write code here
dp=[0 for i in range(n)]
dp[0]=1
max=0
print dp
for i in range(n):
now=0
if i!=0:
res=1
for j in range(i):
if A[i]>A[j]:
res=dp[j]
now=now +1
if now>=max:
max=now
dp[i]=res+1
else:
dp[i]=res
print dp
#return max(dp)
kk=LongestIncreasingSubsequence()
kk.getLIS([1,4,2,5,3],5)
其中dp 是一个以int类型为成员的list
而使用max()函数时却会报错
TypeError: 'int' object is not callable
是由什么原因导致的?
伊谢尔伦2017-04-18 09:24:28
Sebabnya seperti yang @rayleisure katakan, anda menggunakan max
di sini sebagai rujukan kepada pembolehubah jenis int
, menghasilkan
return max(dp)
bukan sahaja menyebabkan fungsi bina dalam gagal, tetapi juga menyebabkan:
TypeError: 'int' object is not callable
Ini kerana anda membuat panggilan ke integer max
,
Ringkasnya, ingatlah untuk tidak menamakan pembolehubah dengan:
kata kunci
fungsi terbina dalam
Nama pustaka standard atau mana-mana pakej/modul yang sedang digunakan
Nama yang sama.
Yang berikut adalah di luar topik
Berdasarkan kod semasa anda, nampaknya anda hanya perlu menulis fungsi menulis kelas ini nampaknya berlebihan (melainkan anda melakukan bank soalan dalam talian?)
Tidak perlu secara khusus melepasi panjang senarai Bertanya tentang panjang senarai dalam Python boleh dilakukan dengan mudah dengan len()
Untuk masalah LIS, saya memudahkan kod anda:
Hanya cari panjang LIS:
def lislength(lst):
"""O(n^2) by button-up method"""
n = len(lst)
dp = [1 for x in lst]
for i in range(n):
for j in range(i+1, n):
if lst[j] > lst[i]:
dp[j] = max(dp[j], dp[i]+1)
return max(dp)
Seluruh LIS menuntut ia keluar:
def lis(lst):
"""O(n^2) by button-up method"""
# use prev to record the previous elements
n = len(lst)
dp = [1 for x in lst]
prev = [-1 for x in lst]
for i in range(n):
for j in range(i+1, n):
if lst[j] > lst[i]:
if dp[i]+1 > dp[j]:
prev[j] = i
dp[j] = dp[i]+1
# find last elements of LIS
maxl = maxpos = 0
for pos, l in enumerate(dp):
if l > maxl:
maxl, maxpos = l, pos
# trace back to find LIS
seq = []
while maxpos >= 0:
seq.append(lst[maxpos])
maxpos = prev[maxpos]
seq.reverse()
return seq
Ujian:
print(lislength([4,5,6,7,1,2,3,9]))
print(lis([4,5,6,7,1,2,3,9]))
print(lislength([1,3,6,7,4,5,9,10,15,12,14]))
print(lis([1,3,6,7,4,5,9,10,15,12,14]))
Keputusan:
5
[4, 5, 6, 7, 9]
8
[1, 3, 6, 7, 9, 10, 12, 14]
Soalan yang saya jawab: Python-QA