509.斐波那契数
这里不用递归的方法,用动态规划的dp数组来存储每个n的斐波那契数,然而最后只需要返回n的斐波那契数,所以只保存最近的两位斐波那契数就可以了。
class Solution:
def fib(self, n: int) -> int:
if n < 2:
return n
dp = [0] * 2
dp[1] = 1
for i in range(2, n+1):
total = dp[0] + dp[1]
dp[0] = dp[1]
dp[1] = total
return dp[1]
70.爬楼梯
和斐波那契基本一样,n层的状态是n-1和n-2层的合,区别是只有n=1开始有意义,同样也可以只保留两个最后的状态。
class Solution:
def climbStairs(self, n: int) -> int:
if n < 3:
return n
dp = [1] * n
dp[1] = 2
for i in range(2, n):
dp[i] = dp[i-1] + dp[i-2]
return dp[-1]
746.使用最小花费爬楼梯
dp数组定义为爬到对应楼层的最小花费, 楼层一共有len(cost)+1层,因为可以从0或者1层起始,所以dp[0]和dp[1]都是0,传递函数是前两层的dp加上对应的cost之后的最小值。
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
dp = [0] * (len(cost) + 1)
for i in range(2, len(cost) + 1):
dp[i] = min(dp[i-1] + cost[i-1], dp[i-2]+cost[i-2])
return dp[-1]