[题解]《算法零基础100讲》(第28讲) 递推问题

1.斐波那契数

题目链接:
509. 斐波那契数

分析:
  这道题的初始条件为f(0) = 0,f(1) = 1,后面的数字是其前面两个数字的和,例如f(2) = f(0) + f(1) = 1。所以我们要直到f(n),首先就得知道f(n - 1) 和 f(n - 2)

代码如下:

int fib(int n){
    
    
    if(n == 0){
    
    
        return 0;
    }
    if(n == 1 || n == 2){
    
    
        return 1;
    }
    return fib(n - 1) + fib(n - 2);
}

2. 第 N 个泰波那契数

题目链接:
1137. 第 N 个泰波那契数
分析:
  这道题和斐波那契数列差不多,就是由n > 3,f(n) = f(n - 1) + f(n - 2) + f(n - 3)

代码如下:

int tribonacci(int n){
    
    
    int t0 = 0, t1 = 1, t2 = 1;
    int num = 0;
    if(n == 0)return 0;
    if(n == 1 || n == 2)return 1;
    for(int i = 3; i <= n; i++){
    
    
        num = t0 + t1 + t2;
        t0 = t1;
        t1 = t2;
        t2 = num;
    }
    return num;
}

3. 杨辉三角

题目链接:
118. 杨辉三角

分析:
  这道题也是一道典型的动态规划问题,我们可以定义一个二维数组dp,初始条件为dp[0][0] = dp[1][0] = dp[1][1] = 1,后面的值都是由状态方程dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]得到的。

代码如下:

int** generate(int numRows, int* returnSize, int** returnColumnSizes){
    
    
    int** ret = (int*)malloc(sizeof(int*) * numRows);
    *returnSize = numRows;
    *returnColumnSizes =(int*) malloc(sizeof(int) * numRows);
    for(int i = 0; i < numRows; i++){
    
    
        ret[i] = malloc(sizeof(int) * (i + 1));
        (*returnColumnSizes)[i] = i + 1;
        ret[i][0] = ret[i][i] = 1;
        for (int j = 1; j < i; ++j) {
    
    
            ret[i][j] = ret[i - 1][j] + ret[i - 1][j - 1];
        }
    }
    return ret;
}

4. 杨辉三角 II

题目链接:
119. 杨辉三角 II

这道题和上题一样,不过不需要将整个返回,只需计算出第rowIndex行的数据,将其返回即可。

代码如下:

int* getRow(int rowIndex, int* returnSize){
    
    
    *returnSize = rowIndex + 1;
    int** dp = (int**)malloc(sizeof(int*) * (rowIndex + 1));
    for(int i = 0; i <= rowIndex; i++){
    
    
        dp[i] = (int*)malloc(sizeof(int) * (i + 1));
        for(int j = 0; j <= i; j++){
    
    
            if(j == 0 || j == i){
    
    
                dp[i][j] = 1;
            }
            else{
    
    
                dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];
            }
        }
    }
    return dp[rowIndex];
}

5. 爬楼梯

题目链接:
70. 爬楼梯

这道题就是一道斐波那契题,数学分析大家可以看该题解:
爬楼梯分析

代码如下:

int climbStairs(int n){
    
    
    if(n == 1){
    
    
        return 1;
    }
    if(n == 2){
    
    
        return 2;
    }
    int a = 1, b = 2;
    int sum = 0;
    for(int i = 3; i <= n; i++){
    
    
        sum = a + b;
        a = b;
        b = sum;
    }
    return sum;
}

6. 圆圈中最后剩下的数字

题目链接:
剑指 Offer 62. 圆圈中最后剩下的数字

题解链接:
数学 + 递归
代码如下:

int lastRemaining(int n, int m){
    
    
    int f = 0;
    for(int i = 2; i != n + 1; i++){
    
    
        f = (m + f) % i;
    }
    return f;
}

猜你喜欢

转载自blog.csdn.net/qq_53060585/article/details/121382885