lintcode: 爬楼梯

时间:2020-12-10 15:01:20

题目:

假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部?

样例

比如n=3,1+1+1=1+2=2+1=3,共有中不同的方法

返回 3

解题:

动态规划题目,同时还是有顺序的,把n拆成 1 、2 的组合 有多少种方式,动态规划,掌握的不好,不能够灵活运行,看看这个能否自己解决。表示没有成功,,九章找的程序。。。

更新

对 n个的台阶,最后一次走,可以走一个台阶,也可以走两个台阶,则f(n) = f(n-1) + f(n-1)

初始值:f(1) = 1  f(2) = 2 f(3) = 3

这个就是费波那列数列,下面的程序就好理解了

java程序:

public class Solution {
/**
* @param n: An integer
* @return: An integer
*/
public int climbStairs(int n) {
// write your code here
if (n <= 1) {
return n;
}
int last = 1, lastlast = 1;
int now = 0;
for (int i = 2; i <= n; i++) {
now = last + lastlast;
lastlast = last;
last = now;
}
return now;
}
}

总耗时: 1204 ms

表示不理解

这里递归程序,很好理解

Java程序:

public class Solution {
/**
* @param n: An integer
* @return: An integer
*/
public int climbStairs(int n) {
// write your code here
if (n == 0 || n == 1) return 1;
if (n < 0) return 0;
return climbStairs(n - 1) + climbStairs(n - 2);
}
}

90%测试数据的时候运行事件超时,上面博客中说了与求费波那列数列很想,然后就可以给写成非递归的程序,就和上面的一样了。下面Python程序就是根据递归的写的。所以重点还是把问题细化,分化求解。

Python程序:

class Solution:
"""
@param n: An integer
@return: An integer
"""
def climbStairs(self, n):
# write your code here
if n==0 or n==1:
return 1
if n< 0:
return 0
f0 = 1
f1 = 1
i = 2
while i<= n:
f = f0 + f1
f0 = f1
f1 = f
i += 1
return f

总耗时: 423 ms