力扣 70.爬楼梯


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

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

注意:给定 n 是一个正整数。
示例
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

解法一: 递归

int climbStairs(int n)
{
	if(n == 1)
		return 1;
	if(n == 2)
		return  2;
	return climbStairs(n-1)+climbStairs(n-2);
}

时间复杂度O(2^n)
很容易就超时溢出
优化:
定义数组将已经计算的过值存起来
进入函数时先判断数组下标n对应的是否有值,有,则返回,没有则计算,再存入数组中,返回。
最后计算出时间复杂度为O(n);
代码如下:

class Solution {
public:
    int climbStairs(int n) {
         int memo[1000] = {0};
         int res = climbStairsMemo(n,memo);
         return res;
    }
    int climbStairsMemo(int n,int memo[1000])
    {
        if(memo[n]>0)
        {
            return memo[n];
        }
        if(n == 1)
            memo[n] = 1;
        else if(n == 2)
            memo[n] = 2;
        else
            memo[n] = climbStairsMemo(n-1,memo)+climbStairsMemo(n-2,memo);
        return memo[n];
    }
};

解法二 : 动态规划

该题依赖于前一次和前前一次的数值,所以我们可以定义数组,将他们记录下来
并使用
代码如下:

class Solution {
public:
    int climbStairs(int n) {
        if(n == 1 || n == 2)
            return n;
        int dp[n];
        dp[1] = 1;
        dp[2] = 2;
        for(int i = 3;i<=n;i++)
            dp[i] = dp[i-1]+dp[i-2];  
        return dp[n];
    }
};

时间复杂度空间复杂度都是O(n);

力扣网友:咖喱土豆的JAVA解法

Java的话因为返回值为int,n=46时,结果会溢出,因此n < 46,那么就有

public int climbStairs(int n) {
    
    int result = 0;
    
    switch(n){
    case 1: result = 1; break;
    case 2: result = 2; break;
    case 3: result = 3; break;
    case 4: result = 5; break;
    case 5: result = 8; break;
    case 6: result = 13; break;
    case 7: result = 21; break;
    case 8: result = 34; break;
    case 9: result = 55; break;
    case 10: result = 89; break;
    case 11: result = 144; break;
    case 12: result = 233; break;
    case 13: result = 377; break;
    case 14: result = 610; break;
    case 15: result = 987; break;
    case 16: result = 1597; break;
    case 17: result = 2584; break;
    case 18: result = 4181; break;
    case 19: result = 6765; break;
    case 20: result = 10946; break;
    case 21: result = 17711; break;
    case 22: result = 28657; break;
    case 23: result = 46368; break;
    case 24: result = 75025; break;
    case 25: result = 121393; break;
    case 26: result = 196418; break;
    case 27: result = 317811; break;
    case 28: result = 514229; break;
    case 29: result = 832040; break;
    case 30: result = 1346269; break;
    case 31: result = 2178309; break;
    case 32: result = 3524578; break;
    case 33: result = 5702887; break;
    case 34: result = 9227465; break;
    case 35: result = 14930352; break;
    case 36: result = 24157817; break;
    case 37: result = 39088169; break;
    case 38: result = 63245986; break;
    case 39: result = 102334155; break;
    case 40: result = 165580141; break;
    case 41: result = 267914296; break;
    case 42: result = 433494437; break;
    case 43: result = 701408733; break;
    case 44: result = 1134903170; break;
    case 45: result = 1836311903; break;
    
    }
    return result;
}

长度较短的有限集合的解,可直接返回值,自己学习算法最终的目的还是为了更好地解决问题。

警醒自己不要沉迷于算法的精妙而忽视实际情况,上了很好的一课。

(也给我上了一课)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SS_zico

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值