【力扣每日一题】——爬楼梯

简介: 动态规划入门算法题——爬楼梯

一、题目描述

原题链接
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶

二、题目分析

如果用递归进行求解的话,在进行递归运算时存在大量的重复计算,我们假设递归树的深度为n,则结点数为2^n 因此时间复杂度为O( n^2)。如果n的值稍微大一些我们的程序就会运行超时。因此我们用动态规划来优化代码。
求解
首先我们先确定DP的状态和转移方程

  • 状态变量: dp[n]表示爬n阶台阶的所有可能情况的总和
  • 状态转移方程: dp(n) = dp(n-1) +dp(n-2)
  • 初始条件: dp(0)=0
  • 边界条件: 因为n是正整数,故不需要考虑n<0的情况,等于n即终止状态转移方程

我们每次进行计算后就保存计算结果,这样保证每次计算都只是计算一次,继而解决重复计算的问题。

三、代码实现

class Solution {
    public int climbStairs(int n) {
        //特判,防止n=1时dp[2]下标越界
         if (n==1) {
            return 1;        
        }
        //定义数组用来存储每次计算的结果
    int[] dp=new int[n+1];
        dp[1]=1;
        dp[2]=2;
        for (int i = 3; i <= n; i++) {
            //状态转移方程
            dp[i]=dp[i-1]+dp[i-2]; 
        }
        return dp[n];
    }
}
相关文章
|
3月前
|
存储 算法 搜索推荐
力扣每日一题 6/13 反悔贪心算法
力扣每日一题 6/13 反悔贪心算法
32 1
|
3月前
|
存储
力扣每日一题 6/9
力扣每日一题 6/9
29 5
|
3月前
力扣每日一题 6/7
力扣每日一题 6/7
24 3
|
3月前
|
Python
力扣每日一题 5/30
力扣每日一题 5/30
26 3
|
3月前
力扣每日一题 6/8
力扣每日一题 6/8
23 3
|
3月前
|
算法
力扣每日一题 6/6
力扣每日一题 6/6
27 3
|
3月前
力扣每日一题 5/27
力扣每日一题 5/27
18 2
|
3月前
力扣每日一题 6/11 暴力搜索
力扣每日一题 6/11 暴力搜索
14 0
|
4月前
【力扣】70. 爬楼梯
【力扣】70. 爬楼梯