爬楼梯问题和时间复杂度的了解

这篇博客探讨了爬楼梯问题,通过示例解释了如何解决并指出递归算法在大输入时可能导致时间超限。作者介绍了时间复杂度的概念,并列举了不同数量级的时间复杂度,强调了在算法选择时应考虑时间复杂度的增长趋势。文章中提到了从递归到迭代的解决方案优化,以降低时间复杂度到O(n)。
摘要由CSDN通过智能技术生成

爬楼梯问题

这道题我做的第一个答案在LeetCode上运行时成功,可是输入8的时候提示超出时间限制,然后,我就搜索下“程序运行时提示超出时间限制跟时间复杂度的关系”,开始重新了解时间复杂度(上课的时候没有认真听)。

爬楼梯问题:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。

示例一

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1: 1 阶 + 1 阶 + 1 阶
2: 1 阶 + 2 阶
3: 2 阶 + 1 阶

我的思路

n是正整数,
我列举了一下n从1到6,到楼顶的总共的方式共有allways种
n=1,countways=1;
n=2,countways=2;
n=3,countways=3;
n=4,countways=5;
n=5,countways=8;
n=6,countways=13;

  • 从第三层可以看出规律,
    爬到第n个层的方式总数 = 爬到第n-1层的方式总数 + 爬到第n-2层的方式总数
    所以把它看成一个递归函数,就是
    F ( n ) = F ( n − 1 ) + F ( n − 2 ) ( n > 2 ) F(n)=F(n-1)+F(n-2)(n>2) F(n)=F(n1)+F(n2)(n>2),即
    climbStairs(int n)=climbStairs(int n-1)+climbStairs(int n-2)
    所以我做出的第一个答案如下:

答案一

class Solution {
    public int climbStairs(int n) {
        int countways= 0;
        int i = 3;
        if(n<3) 
            return n;
        if(n>2)
            do{
                countways= climbStairs(n-1) + climbStairs(n-2);
                i++;
            }while(i>n);
        return countways;
    }
}

运行后是成功的,在LeetCode做完提交后,程序运行结果却在 n = 5 n=5 n=5的时候显示超出时间限制
于是我把do while语句改成while语句

while(i<=n){
      countways= climbStairs(n-1) + climbStairs(n-2);
      i++;
 }

提交后发现输入35的时候,程序运行结果还是显示超出时间限制,
接着我继续试了一下for语句

for(int i = 3; i <= n; i++){
    	 countways= climbStairs(n-1) + climbStairs(n-2);
     }

程序运行成功,可提交后也跟while语句的运行结果一样

于是我搜索了下程序运行结果提示超出时间限制是什么原因,该怎么解决?看到一般的回答是,换个思路,优化一下,减少运行时间。我再搜索下程序运行结果提示超出时间限制跟时间复杂度的关系,然后我拿起了我的数据结构的教材书,重新认识了下时间复杂度。

什么叫做时间复杂度

完成某求解问题规模为n的算法所需要的时间称为时间复杂度。
对于机器而言,完成一个语句的单位时间是微不足道的,在计算时间复杂度是,只关心完成问题规模n的算法时间的数量级,记为 O ( n ) O(n) O(n)。问题规模n指的是输入量。数量级则只关心 n n n 的最高次幂而忽略其他低次项和系数,如表示算法时间的式子里包含了 n 2 + n n^2+n n2+n,当 n n n 足够大时,对于计算机而言, n n n 要比

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值