20210115领扣刷题
20210115领扣刷题
一、斐波纳契数列(366)
1.题目:
查找斐波纳契数列中第 N 个数。
所谓的斐波纳契数列是指:
- 前2个数是 0 和 1 。
- 第 i 个数是第 i-1 个数和第i-2 个数的和。
斐波纳契数列的前10个数字是:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ...
样例
样例 1:
输入: 1
输出: 0
样例解释:
返回斐波那契的第一个数字,是0.
样例 2:
输入: 2
输出: 1
样例解释:
返回斐波那契的第二个数字是1.
2.遇到问题:
使用递归会超时,只能通过80%的测试。
public int fibonacci(int n) {
// write your code here
int s ;
if(n == 1){
s = 0;
}else if (n == 2){
s = 1;
} else if(n > 2){
s = fibonacci(n-2) + fibonacci(n-1);//递归
}else{
s = 0;
}
return s;
}
3.正解:
public int fibonacci(int n) {
// write your code here
int s =0;
int i1 = 0;
int i2 = 1;
if(n == 1){
s = 0;
}else if (n == 2){
s = 1;
} else if(n > 2){
for (int i = 1;i <= n-2 ; i++){
s = i1 + i2;
i1 = i2;
i2 = s;
}
}else{
s = 0;
}
return s;
4.分析:
递归是很直观的解决问题的方式,但往往递归的分支较多或层数较深的时候会导致程序运行超时或递归栈爆炸。可以用递推来解决递归的问题。