力扣509题、70题(斐波那契数列、爬楼梯)

509、斐波那契数列

基本思想:

动态规划,滚动数组思想

具体实现:

循环n-1次

 动态递归五部:

1.确定dp数组以及下标的含义

dp[i]的定义为:第i个数的斐波那契数值是dp[i]

2.确定递推公式

状态转移方程dp[i] = dp[i - 1] + dp[i - 2]

3.dp数组如何初始化

dp[0] = 0;

dp[1] = 1;

4.确定遍历顺序

从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],

那么遍历的顺序一定是从前到后遍历的

5.举例推导dp数组

n为10的dp数组

0 1 1 2 3 5 8 13 21 34 55

 代码:

class Solution:
    def fib(self, n: int) -> int:
        if n<2:
            return n
        dp = [0]*(n+1)
        dp[1] = dp[2] = 1
        for i in range(3,n+1):
            dp[i] = dp[i-1] + dp[i-2]
        return dp[n]
class Solution {
    public int fib(int n) {
        if (n <= 1) return n;
        int[] dp = new int[n+1];
        dp[0] = 0;
        dp[1] = 1;
        for (int index = 2; index <= n; index++){
            dp[index] = dp[index - 1] + dp[index -2];
        }
        return dp[n];
    }
}
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
class Solution {
    public int fib(int n) {
        if (n < 2) return n;
        int p = 0, q = 1, r = 0;
        for (int i = 1; i < n; i++) {
            r = p + q;
            p = q;
            q = r;
        }
        return r;
    }
}

70、爬楼梯

基本思想:

动态规划

具体实现:

1、确定dp数组及其含义

dp[i]:爬到第i层楼梯,有dp[i]种方法

2、确定递推公式

dp[i-1],上i-1层楼梯,有dp[i-1]种方法,再一步跳一个台阶就是dp[i]

dp[i-2],上i-2层楼梯,有dp[i-2]种方法,再一步跳两个台阶就是dp[i]

dp[i] = dp[i-1]+dp[i-2]

3、dp数组如何初始化

dp[1] = 1,dp[2] = 2,从i=3开始递推

4、确定遍历顺序

从递推公式看出,遍历顺序是从前往后

5、举例推导dp数组

n=5的时候

代码:

class Solution {
   public int climbStairs(int n) {
        int[] dp = new int[n + 1];
        if (n <= 1) return n;
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
}

优化:

class Solution {
   public int climbStairs(int n) {
        if (n <= 1) return n;
        int[] dp = new int[3];
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; i++) {
            int sum = dp[1] + dp[2];
            dp[1] = dp[2];
            dp[2] = sum;
        }
        return dp[2];
    }
}
原文地址:https://www.cnblogs.com/zhaojiayu/p/14510544.html