509. 斐波那契数
1、第一想法是用一个dp数组,后来想可以用滑动的思想
2、第一次提交的时候忘记讨论n1和n2的情况了。
3、
class Solution:
def fib(self, n: int) -> int:
if n==0:
return 0
if n==1:
return 1
p=0
q=1
i=p+q
for i in range(2,n+1):
i =p+q
p=q
q=i
return i
```![在这里插入图片描述](https://img-blog.csdnimg.cn/8a0120f313d344acbef780b73962d20d.png)
4、和大佬写的对比一下
https://leetcode-cn.com/problems/fibonacci-number/solution/dong-tai-gui-hua-tao-lu-xiang-jie-by-labuladong/
这篇思路写的太好啦!!!
总结一下:
1、暴力算法其实就是递归,是自顶向下的,里面有很多重复的项;将这些重复的项用memo记录,就可以减少重复;如果自底向上就是动态规划。
2、动态规划特点:求最优解;有最优子结构;状态转移方程
3、大佬写的明显简单不少
n小于2,如何处理;
赋值可以一下子两个值
5、把自己的再精进一下
```bash
class Solution:
def fib(self, n: int) -> int:
if n<2:
return n
p,q,r=0,0,1
for i in range(2,n+1):
p,q=q,r
r =p+q
return r
1137. 第 N 个泰波那契数
- 和斐波那契差不多,所以改进了自己的代码风格
class Solution:
def tribonacci(self, n: int) -> int:
if n==0:
return 0
elif n<3:
return 1
else:
p,q,s,r=0,0,1,1
for i in range(3,n+1):
p,q,s = q,s,r
r=p+q+s
return r
2、和大佬的对比一下,好像我的更加简洁
70. 爬楼梯
1、爬楼梯问题把dp【n】定义为爬n接台阶有几种方法,可以使用滚动的方法。
2、不过,最开始我出现了一个错误。就是在init的时候,2级台阶应该是2种方法,我误认为是1种了。
class Solution:
def climbStairs(self, n: int) -> int:
if n<3:
return n
p,q,s=0,1,2
for i in range(3,n+1):
p,q = q,s
s = p+q
return s
746. 使用最小花费爬楼梯
1、最小花费就很像是动态规划的问题了。
2、稍微有一点小问题出在认为刚开始到第0,1也需要支付费用,其实是不用的。我们是免费地先站在0/1,然后从0/1走,才需要支付相应的cost[0]/cost[1],改正就没问题啦~
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
n = len(cost)
if n<2:
return 0
p,q,s = 0,0,0
for i in range(2,n+1):
p,q = q,s
s = min(q+cost[i-1],p+cost[i-2])
return s