You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

Note: Given n will be a positive integer.

Example 1:

  1. Input: 2
  2. Output: 2
  3. Explanation: There are two ways to climb to the top.
  4. 1. 1 step + 1 step
  5. 2. 2 steps

Example 2:

  1. Input: 3
  2. Output: 3
  3. Explanation: There are three ways to climb to the top.
  4. 1. 1 step + 1 step + 1 step
  5. 2. 1 step + 2 steps
  6. 3. 2 steps + 1 step

解法:动态规划DP(Dynamic Programming)入门题。

state: dp[i] 表示爬到第i个楼梯的所有方法的和
function: dp[i] = dp[i-1] + dp[i-2]  //因为每次走一步或者两步, 所以dp[i]的方法就是它一步前和两步前方法加和
initial: dp[0] = 0; dp[1] = 1
end : return dp[n]

Java: Method 1: Time: O(n), Space: O(n)

  1. public int climbStairs(int n) {
  2. int[] dp = new int[n + 1];
  3. dp[0] = 1;
  4. dp[1] = 1;
  5. for (int i = 2; i <= n; i++) {
  6. dp[i] = dp[i - 1] + dp[i - 2];
  7. }
  8. return dp[n];
  9. }

Java: Method 2: Time:  O(n), Space: O(1)

  1. public int climbStairs(int n) {
  2. if (n == 0 || n == 1 || n == 2){
  3. return n;
  4. }
  5. int [] dp = new int[3];
  6. dp[1] = 1;
  7. dp[2] = 2;
  8. for (int i =3; i <= n; i++) {
  9. dp[i%3] = dp[(i-1)%3] + dp[(i-2)%3];
  10. }
  11. return dp[n%3];
  12. }

Java: Method 3: Time:  O(n), Space: O(1)

  1. public class Solution {
  2. public int climbStairs(int n) {
  3. int[] dp = new int[]{0,1,2};
  4. if(n < 3) return dp[n];
  5. for(int i = 2; i < n; i++){
  6. dp[0] = dp[1];
  7. dp[1] = dp[2];
  8. dp[2] = dp[0] + dp[1];
  9. }
  10. return dp[2];
  11. }
  12. }

Java:

  1. public class Solution {
  2. public int climbStairs(int n) {
  3. if (n <= 1) return 1;
  4. int[] dp = new int[n];
  5. dp[0] = 1; dp[1] = 2;
  6. for (int i = 2; i < n; ++i) {
  7. dp[i] = dp[i - 1] + dp[i - 2];
  8. }
  9. return dp[n - 1];
  10. }
  11. }

Python: DP

  1. class Solution(object):
  2. def climbStairs(self, n):
  3. if n < 3:
  4. return n
  5. dp = [0] * n
  6. dp[0] = 1
  7. dp[1] = 2
  8. for i in range(2, n):
  9. dp[i] = dp[i-2] + dp[i-1]
  10.  
  11. return dp[n-1]  

Python:  DP, Time: O(n) Space: O(1)

  1. class Solution:
  2. def climbStairs(self, n):
  3. prev, current = 0, 1
  4. for i in xrange(n):
  5. prev, current = current, prev + current,
  6. return current

Python:  Recursion,Time:  O(2^n) Space: O(n)

  1. class Solution:
  2. def climbStairs1(self, n):
  3. if n == 1:
  4. return 1
  5. if n == 2:
  6. return 2
  7. return self.climbStairs(n - 1) + self.climbStairs(n - 2)

C++:

  1. class Solution {
  2. public:
  3. int climbStairs(int n) {
  4. if (n <= 1) return 1;
  5. vector<int> dp(n);
  6. dp[0] = 1; dp[1] = 2;
  7. for (int i = 2; i < n; ++i) {
  8. dp[i] = dp[i - 1] + dp[i - 2];
  9. }
  10. return dp.back();
  11. }
  12. };  

 

类似题目:

[LeetCode] 53. Maximum Subarray 最大子数组

[LeetCode] 746. Min Cost Climbing Stairs

[Airbnb] Max Sum of Non-consecutive Array Elements

 

All LeetCode Questions List 题目汇总

  

  

  

 

[LeetCode] 70. Climbing Stairs 爬楼梯的更多相关文章

  1. [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 ...

  2. LeetCode 70. Climbing Stairs爬楼梯 (C++)

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

  3. [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 ...

  4. Leetcode 70. Climbing Stairs 爬楼梯 (递归,记忆化,动态规划)

    题目描述 要爬N阶楼梯,每次你可以走一阶或者两阶,问到N阶有多少种走法 测试样例 Input: 2 Output: 2 Explanation: 到第二阶有2种走法 1. 1 步 + 1 步 2. 2 ...

  5. 70. Climbing Stairs爬楼梯

    网址:https://leetcode.com/problems/climbing-stairs/ 其实就是斐波那契数列,没什么好说的. 注意使用3个变量,而不是数组,可以节约空间. class So ...

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

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

  7. 42. leetcode 70. Climbing Stairs

    70. Climbing Stairs You are climbing a stair case. It takes n steps to reach to the top. Each time y ...

  8. LN : leetcode 70 Climbing Stairs

    lc 70 Climbing Stairs 70 Climbing Stairs You are climbing a stair case. It takes n steps to reach to ...

  9. leetCode 70.Climbing Stairs (爬楼梯) 解题思路和方法

    Climbing Stairs  You are climbing a stair case. It takes n steps to reach to the top. Each time you ...

随机推荐

  1. Python使用pip安装TensorFlow模块

    1.首先确保已经安装python,然后用pip来安装matplotlib模块. 2.进入到cmd窗口下,建议执行python -m pip install -U pip setuptools进行升级. ...

  2. 《exception》第九次团队作业:Beta冲刺与验收准备(大结局)

    一.项目基本介绍 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 Exception 作业学习目标 1.掌握软件黑盒测试技术:2.学会编制软件项目 ...

  3. Docker 部署 vue 项目

    Docker 部署 vue 项目 Docker 作为轻量级虚拟化技术,拥有持续集成.版本控制.可移植性.隔离性和安全性等优势.本文使用Docker来部署一个vue的前端应用,并尽可能详尽的介绍了实现思 ...

  4. 利用Python绘制一个正方形螺旋线

    1 安装turtle Python2安装命令: pip install turtule Python3安装命令: pip3 install turtle 因为turtle库主要是在Python2中使用 ...

  5. 10、Python迭代器与生成器(iterator、for循环、generator、yield)

    一.迭代器(foreach) 1.可迭代的对象 内置有__iter__方法的都叫可迭代的对象. Python内置str.list.tuple.dict.set.file都是可迭代对象. x = 1._ ...

  6. springboot使用jdbcTemplate案例

    1 创建实体类 public class Student { private Integer stuid; private String stuname; public Integer getStui ...

  7. maven install

    1. install maven under ubuntu apt install maven 2 speed up package download vim ~/.m2/settings.xml & ...

  8. gitbase 集成sqler 进行git 代码分析

      gitbase 是一个方便的git sql 查询引擎,sqler 是一个很不错的sql 转rest api工具,以下是一个简单的集成测试 项目使用docker-compose 运行 环境准备 do ...

  9. HAVING 搜索条件在进行分组操作之后应用

    HAVING 搜索条件在进行分组操作之后应用: 如:查询帖子访问量大于15的用户id: select t.user_id,u.name,sum(count_view) from t_topic t l ...

  10. CSP2019自闭记

    为什么我之前没有写呢,是因为我总是考的太lj,于是就不想写了. 这次不管考没考好都要强迫自己写,因为这是第一次参加提高组+第一次参加CSP. 当然什么初赛/复赛试题/答案什么的是不会出现的. Day ...