暴力破解,會超時!
class solution(object):
def climbstairs(self, n):
""":type n: int
:rtype: int
"""return self.climb_stairs(0,n)#第乙個引數代表還沒有邁出第一步
def climb_stairs(self,i,n):
if( i>n): #如果在最後了2步之後,超出n的值,則證明這走法不合適,不是一種走法
return 0
if( i==n):#正好相等,則是一種走法,返回1
return 1
step1=self.climb_stairs(i+1,n) # 下一次走一步
step2=self.climb_stairs(i+2,n)# 下一次走兩步
print step1,step2
return step1+step2
so = solution()
print so.climbstairs(35);
#暴力破解
#一遍一遍的去模擬過程方法二
#-*- coding: utf-8 -*-
# 方法二
class solution(object):
def climbstairs(self, n):
""":type n: int
:rtype: int
"""li={} #儲存已經探明的台階走法的種數
return self.climb_stairs(0,n,li)
def climb_stairs(self,i,n,li):
if i>n: #在邁出最後一步(可能是乙個台階,兩個台階)之後,如果超過
return 0 #則表示這種走台階的方法是不可行的
elif i==n: #若相等,則表示該種走台階的方法是可行的
return 1 #故返回1,代表一種走法
elif li.get(i,-1) != -1: #若第i個台階到到台階頂的種數存在,
return li.get(i) #則直接返回該種數
step1=self.climb_stairs(i+1,n,li) #試探只走乙個台階的情況
step2=self.climb_stairs(i+2,n,li) #試探走兩個台階的情況
li[i] = step1+step2 #儲存第i個台階走到台階頂的走法種數
return li.get(i)
so = solution()
print so.climbstairs(35);
#舉個例子,當n等於5的時候,若遞迴到i=3
# i=3,下一步遞迴i+1,i+1的值為4,
# i=4,下一步遞迴i+1,i+1的值為5,滿足i==n的情況,返回1
# i=4,然後在遞迴i+2,i+2的值為6,滿足i>n的情況,放回0
# i=4,設定li[i]=step1+step2,即為li[4]=step1+step2=1+0=1,返回
#i=3,下一步遞迴i+2,i+2的值為5,
#i=5,滿足遞迴條件i==n,返回1
#i=3,li[i]=step1+step2,即li[3]=step1+step2=1+1=2方法三:
class solution(object):
def climbstairs(self, n):
""":type n: int
:rtype: int
"""k=1
m=2if n==1:
return k
if n==2:
return m
for i in range(3,n+1):
t=k+m
k=mm=t
return m試出來的!
鑑於本人知識水平有限,如有錯誤,歡迎指正!
演算法4 爬梯子Climbing Stairs
題目 你準備要爬樓梯。你面對的是乙個 n 步可以走上去的樓梯。你每次可以走一步或者兩步,那麼你有幾種不同的方式可以爬上去嗎?n為正 思路 我看到題的第乙個想法,拿個數試下找規律,我以n為3來找,即要爬乙個3階樓梯,第一種一步三次,第二種先一步後兩步,第三種先兩步後一步,共三種,當n為4時有5種,發現...
靜態聯編與動態聯編
在c 中,多型性主要是通過函式過載實現的。過載函式是指程式中對同名函式進行呼叫時,編譯器會根據函式引數的型別和個數,決定該呼叫哪一段函式 來處理這個函式呼叫。這種把函式呼叫與適當的函式 相對應的動作,叫做聯編。聯編分為靜態聯編和動態聯編。在編譯階段決定執行哪個同名的被呼叫函式,稱為靜態聯編。在編譯階...
靜態聯編和動態聯編
聯編是指乙個電腦程式自身彼此關聯 使乙個 源程式經過編譯 連線,成為乙個可執行程式 的過程,在這個聯編過程中,需要確定程式中的操作呼叫 函式呼叫 與執行該操作 函式 的 段之間的對映關係,按照聯編所進行的階段不同,可分為靜態聯編和動態聯編。靜態聯編 呼叫函式和被調函式在程式編譯時,他們在記憶體中的位...