问题:

爬n阶楼梯,每次只能走1阶或者2阶,计算有多少种走法。

暴力计算+记忆化递归。

从位置 i 出发,每次走1阶或者2阶台阶,记录从位置 i 出发到目标 n 所有的走法数量,memoA[i] 。记录的数据可以重复使用,避免冗余计算。

时间复杂度:O(n)。每次计算从 i 位置出发到终点 n 的走法,共计算 n 次,即树形递归的大小为n。

空间复杂度:O(n)。使用了长度为 n 的数组。

clock_t start1, end1;

class Solution {
public:
int climbStairs(int n) { int memo[n+] = {}; start1 = clock();
int result = climb_stairs(, n, memo);
end1 = clock(); cout << "cost time = " << (double)(end1 - start1) / CLOCKS_PER_SEC << endl; return result;
} int climb_stairs(int i, int nums, int memoA[]) { if (i > nums)
return ; if (i == nums)
return ; if (memoA[i] > )
return memoA[i]; memoA[i] = climb_stairs(i+, nums, memoA) + climb_stairs(i+, nums, memoA); return memoA[i];
}
};

动态规划

动态规划的关键步骤在于构建递归函数。由于第n级阶梯可由第n-1级(跨一步)和第n-2级(跨两步)到达。记 f(n) 为到达第n级阶梯的方案数量,则有递归函数 f(n) = f(n-1)+f(n-2).

1)动态规划第一种实现方法:

时间复杂度:O(2^n)。其运算过程就是一个完全二叉树的展开,共有 2^(n-2)+1 个节点,即递归运算了 2^(n-2)+1 次。

空间复杂度:O(n)。递归深度达到n层。

class Solution {
public:
int climbStairs(int n) {
if (n == )
return ;
if (n == )
return ; int sumMethod = climbStairs(n-) + climbStairs(n-); return sumMethod;
}
};

2)动态规划第二种实现方法:

时间复杂度:O(n)

空间复杂度:O(n)

class Solution {
public:
int climbStairs(int n) {
if (n == )
return ; int memo[n+] = {};
memo[] = ;
memo[] = ; for(int i = ; i <= n; ++i) {
memo[i] = memo[i-] + memo[i-];
} return memo[n];
}
};

斐波那契数

将动态规划的第二种实现方法进行修改。第一项为1,第二项为2,斐波那契数的计算公式如下:

fib(n) = fib(n-1)+fib(n-2)。

时间复杂度:O(n)

空间复杂度:O(1)

还存在时间复杂度为 O(log(n))算法,其核心思想为直接找到第n个斐波那契数,而非进行遍历计算。

这就是算法的魅力。从暴力求解开始,逐步优化算法流程,砍掉冗余的计算步骤,尽可能去除遍历步骤。最终达到提升时间复杂度和空间复杂度的目的。

【Leetcode】爬楼梯的更多相关文章

  1. 70.LeetCode爬楼梯

    爬楼梯 点击标题可跳转到官网进行查看 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: ...

  2. 水leetcode 爬楼梯

    public class Solution { public int climbStairs(int n) { if(n==1) return 1; if(n==2) return 2; int pr ...

  3. LeetCode初级算法--动态规划01:爬楼梯

    LeetCode初级算法--动态规划01:爬楼梯 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...

  4. 【LeetCode】746. 使用最小花费爬楼梯

    使用最小花费爬楼梯 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i](索引从0开始). 每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或 ...

  5. [LeetCode] 70. Climbing Stairs 爬楼梯问题

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  6. LeetCode 70. 爬楼梯(Climbing Stairs)

    70. 爬楼梯 70. Climbing Stairs 题目描述 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意: 给定 ...

  7. LeetCode 746. 使用最小花费爬楼梯(Min Cost Climbing Stairs) 11

    746. 使用最小花费爬楼梯 746. Min Cost Climbing Stairs 题目描述 数组的每个索引做为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i].(索引从 0 ...

  8. Leetcode之动态规划(DP)专题-746. 使用最小花费爬楼梯(Min Cost Climbing Stairs)

    Leetcode之动态规划(DP)专题-746. 使用最小花费爬楼梯(Min Cost Climbing Stairs) 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost ...

  9. Leetcode#70. Climbing Stairs(爬楼梯)

    题目描述 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解 ...

  10. LeetCode 70 - 爬楼梯 - [递推+滚动优化]

    假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2输出: 2解释: 有两种方 ...

随机推荐

  1. CF486B OR in Matrix(构造+思维)

    CF486B 一道有趣的思维题 由于or的性质可知只要a[i][j]为1那么b中第i行,第j列将都变成1 相反的,如果b[i][j]是0那么a中第i行,第j列都必须是0 根据第二个性质我们可以构造出a ...

  2. Python 之父 63 岁才退休,我 23 就中年危机。。

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 Python 之父 Guido van Rossum 在推特公布了自己从 Dropbox 公司离职的消息,并表示已经退休. ...

  3. PHP控制session时效(转)

    1.php session 有效期php的session有效期默认是1440秒(24分钟),如果客户端超过24分钟没有刷新,当前session会被回收,失效. 当用户关闭浏览器,会话结束,sessio ...

  4. Appium+Python之获取toast

    思考:手机APP上的必填或错误文本提示一般1-2s就会消失,比较难定位,所以一般的固定元素定位方式是不可用的,那我们如何定位toast呢? 前提:1.Appium1.6.3以上(包括1.6.3) 2. ...

  5. uoj218_火车管理

    题意 \(n\)个位置,每个位置一个栈,三种操作,询问区间栈顶的和,区间入栈某个数,单点出栈某个数. 分析 用一个线段树来维护栈顶的和,区间(单点)更新和区间询问. 用一个主席树来维护每个位置最新一次 ...

  6. sql删除重复行和删除字段首位

    删除重复行 user_info: -- 单字段筛选重复行 SELECT *from user_info WHERE NAME in ( SELECT NAME from user_info GROUP ...

  7. Shiro多Realm验证

    在单Realm的基础上,进行如下内容的修改 原有的ShiroRealm.java: package com.atguigu.shiro.realms; import org.apache.shiro. ...

  8. Python 安装cx_Oracle模块折腾笔记

    kali linux/ubuntu下安装: 不得不说安装这个模块很蛋疼,决定做个记录. sudo apt install build-essential unzip python-dev libaio ...

  9. 爬虫获取网页数据,报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start by

    https://blog.csdn.net/hj_xy_0705/article/details/85011072

  10. 右则css 小浮条

    <!--右边浮动--> <div class="indexfu"> <div class="indexfu2" id=" ...