LeetCode 70.爬楼梯 + 记忆化搜索 + 递推 + 动态规划 + 空间优化

关于此题的我的往期文章:

leetCode 70.爬楼梯 动态规划_呵呵哒( ̄▽ ̄)"的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_41987016/article/details/133325224?spm=1001.2014.3001.5501

  • i-1层楼梯,有 dfs(i-1) 种方法,那么再一步跳一个台阶就是 dfs(i)
  • i-2层楼梯,有 dfs(i-2) 种方法,那么再一步跳两个台阶就是 dfs(i)

也就是说可以求出 dfs(i),即 dfs(i) = dfs(i-1) + dfs(i-2)

(1) 递归(超时)

class Solution {
public:
    // 递归
    int climbStairs(int n) {
        function<int(int)> dfs=[&](int i) -> int {
            if(i==0 || i==1) return 1;
            return dfs(i-1) + dfs(i-2);
        };
        return dfs(n);
    }
};

(2)递归搜索 + 保存计算结果 = 记忆化搜索

class Solution {
public:
    // 记忆化搜索
    int climbStairs(int n) {
        vector<int> memo(n+2,-1);
        function<int(int)> dfs=[&](int i) -> int {
            if(i==0 || i==1) return 1;
            int &res = memo[i];
            if(res != -1) return res;
            return res=dfs(i-1) + dfs(i-2);
        };
        return dfs(n);
    }
};

(3)1:1 翻译成递推

  • dfs(i)=dfs(i-1)+dfs(i-2)

  • f(i)=f(i-1)+f(i-2)

  • f(i+2)=f(i+1)+f(i)

class Solution {
public:
    // 递推
    int climbStairs(int n) {
        vector<int> f(n+2,0);
        f[0]=1;
        f[1]=1;
        for(int i=0;i<=n-2;i++) 
            f[i+2] = f[i+1] + f[i];
        return f[n];
    }
};
class Solution {
public:
    // 递推
    int climbStairs(int n) {
        vector<long> f(n+1,0);
        f[0]=1;
        f[1]=1;
        for(int i=2;i<=n;i++) 
            f[i] = f[i-1] + f[i-2];
        return f[n];
    }
};
class Solution {
public:
    // 递推
    int climbStairs(int n) {
        int f0=1,f1=1,sum;
        for(int i=2;i<=n;i++) {
            sum = f0+f1;
            f0 = f1;
            f1=sum;
        }  
        return f1;
    }
};

(4)动态规划

class Solution {
public:
int climbStairs(int n) {
        if(n<=1) return n;// 因为下面直接对dp[2] 操作了,防止空指针
        vector<int> dp(n+1,0);
        dp[1]=1;
        dp[2]=2;
        for(int i=3;i<=n;i++) 
            dp[i] = dp[i-1] + dp[i-2];
        return dp[n];
    }
};

 


http://www.niftyadmin.cn/n/5145153.html

相关文章

偶数矩阵判断【C语言作业】

题目 若一个布尔矩阵所有行和所有列的和都是偶数&#xff0c;则称为偶数矩阵。请编写一个程序&#xff0c;判断一个布尔矩阵是否是偶数矩阵。 要求&#xff1a; &#xff08;1&#xff09;输入:首先输入一个正整数n(n<100),代表该矩阵的大小&#xff0c;接下来是n行n列的矩…

若依系统的数据导入功能设置

一、后端 Log(title "公交站牌", businessType BusinessType.IMPORT)PreAuthorize("ss.hasPermi(busStop:busStop:import)")PostMapping("/importData")public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exce…

【Qt控件之QLineEdit】N多种用法及技巧

【Qt控件之QLineEdit】N多种用法及技巧 介绍用法用法1&#xff1a;信号触发 用法2&#xff1a;添加动作用法3&#xff1a;删除光标最侧字符用法4&#xff1a;设置光标位置用法5&#xff1a;删除用法6&#xff1a;选择和取消选择用法7&#xff1a;不为空时是否显示清除按钮用法8…

【1day】宏景OA get_org_tree.jsp接口SQL注入漏洞学习

注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录

【jvm】方法的调用

目录 一、方法的调用二、非虚方法三、虚方法四、虚拟机调用指令4.1 普通调用指令4.2 动态调用指令 五、代码示例5.1 父类5.2 子类5.3 接口5.4 接口实现 六、方法指令七、说明八、invokedynamic指令8.1 说明8.2 代码示例8.3 main方法指令 九、方法重写的本质十、虚方法表 一、方…

AIOPS学习资源

时间序列分析-B站 时间序列分析的基础、原理、算法和应用-知乎 时间序列数据分析101 - (1) 一份全面详尽的时间序列入门教程-知乎-推荐 图解 72 个机器学习基础知识点-推荐 机器学习入门与核心概念-B站 机器学习&#xff1a;盘点最常见的7种数据预处理方法和原理-知乎

[题] 查找最大元素 #字符输入

题目&#xff1a;1381 查找最大元素 对于输入的每个字符串&#xff0c;查找其中的最大字母&#xff08;ASCII码最大&#xff09;&#xff0c;在该字母后面插入字符串“(max)”。 输入 输入数据包括多个测试实例&#xff0c;每个实例由一行长度不超过100的字符串组成&#xff0c…

【ML】线性回归

线性回归 以房价为例。 单因子线性回归 房价和面积建立回归模型。 多因子线性回归 房价和面积、收入、房龄、地区人口数建立回归模型。 线性回归模型评估 MSE 越小越好&#xff0c; R 2 R^2 R2越接近1越好 MSE&#xff08;预测值y 和实际值y’ 的均方误差&#xff09; …