爬楼梯问题
这道题我做的第一个答案在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(n−1)+F(n−2)(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 要比