剑指offer:青蛙跳台阶I & II

I 题目:

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

思路:

斐波那契数列变体,关键是找出递推公式。

假设跳n级台阶有f(n)中跳法,容易发现f(1)=1,f(2)=2; n>2时,如果最后一次跳一级台阶,一共有f(n-1)种跳法,如果最后一次跳两级台阶,一共有f(n-2)种跳法。即f(n)=f(n-1)+f(n-2)。

代码:

在线测试OJ:

https://www.nowcoder.com/practice/8c82a5b80378478f9484d87d1c5f12a4?tpId=13&tqId=11161&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

AC代码:

class Solution {
public:
//循环
    int jumpFloor(int number) {
	if(number <= 0)
		return 0;
	if(number == 1)
		return 1;
	if(number == 2)
		return 2;
        int n_1 = 2;
        int n_2 = 1;
	int f_n;
	for(int i = 3; i <= number; i++)
	{
		f_n = n_1 + n_2;
		n_2 = n_1;
		n_1 = f_n;
	}
	return f_n;
    }
};

II 题目:

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思路:

斐波那契数列变体,关键是找出递推公式。

同样的思路,但是递推公式变为,f(1)=1,f(2)=2,f(n)=1+f(1)+f(2)+...+f(n-2)+f(n-1),由f(n-1)=1+f(1)+f(2)+...+f(n-2),两式相减可得,f(n)=2f(n-1),n>=3。用数学归纳法可以证明,f(n)=2^(n-1)。

代码:

在线测试OJ:

https://www.nowcoder.com/practice/22243d016f6b47f2a6928b4313c85387?tpId=13&tqId=11162&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

AC代码:

class Solution {
public:
    int jumpFloorII(int number) {
	if(number <= 0)
		return 0;
	if(number == 1)
		return 1;
	if(number == 2)
		return 2;
        int n_1 = 2;
	int f_n;
	for(int i = 3; i <= number; i++)
	{
		f_n = 2*n_1;
		n_1=f_n;
	}
	return f_n;
    }
};

猜你喜欢

转载自blog.csdn.net/u012991043/article/details/81034449