剑指 Offer 10- I. 斐波那契数列
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
来源:力扣(LeetCode)
思路很简单,唯一需要注意的就是取模和特殊情况,取模最好在运算中取,最后特殊情况就是n = = 0 、 n= =1 、 n = = 2,一和二都通过if去掉了,而当n==0时(此时应返回0),由于for的条件,程序会直接return sum;所以我们把sum的初值设置为0就好了
class Solution {
public:
int fib(int n) {
if(n == 1 || n == 2) return 1;
int num1 = 1 , num2 = 1;
int sum = 0;
for(int i = 3;i <= n;i++)
{
sum = (num1 + num2)%(int)(1e9+7);
num1 = num2;
num2 = sum;
}
return sum;
}
};
剑指 Offer 10- II. 青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
来源:力扣(LeetCode)
这题初看题目我还没反应过来,仔细想了一会反应过来
假设n = = 5,青蛙在跳到第3阶的时候可以跳两步直接上5,也可以在4阶的时候跳一步上5
假设台阶于方法数的关系为f(n)
由上面的例子可得f(5) = f(4) + f(3)
f(4)也同理 = f(3) + f(2)…
这题的程序于上面那题唯一不一样的地方就是初值,和特殊情况
class Solution {
public:
int numWays(int n) {
if(n == 0 || n == 1 ) return 1;//特殊情况
int sum = 0 , n1 = 1 , n2 = 1;
for(int i = 2 ; i<=n ; i++)//这里i = 2
{
sum = (n1 + n2)%(int)(1e9+7);
n1 = n2;
n2 = sum;
}
return sum;
}
};