LintCode-查找斐波纳契数列中第 N 个数

题目:

查找斐波纳契数列中第 N 个数。

所谓的斐波纳契数列是指:

  • 前2个数是 0 和 1 。
  • 第 i 个数是第 i -1 个数和第 i -2 个数的和。

斐波纳契数列的前10个数字是:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ...

注意事项

The Nth fibonacci number won‘t exceed the max value of signed 32-bit integer in the test cases.

样例

给定 1,返回 0

给定 2,返回 1

给定 10,返回 34

编码:【推荐方式三】

方式一:编程好理解,但代码复杂,性能较差,且占用内存;LintCode耗时2475ms

 1 public class Solution {
 2     /*
 3      * @param : an integer
 4      * @return: an ineger f(n)
 5      */
 6     public int fibonacci(int n) {
 7         // write your code here
 8         int[] a = null ;
 9
10         if(n>2){
11             a = new int[n];
12             a[0] = 0; a[1] = 1 ;
13             for(int i=2;i<n;i++){
14                 a[i] = (a[i-1]+a[i-2]);
15             }
16             return a[n-1];
17         }else if(n==1){
18             return 0;
19         }else if(n==2){
20             return 1;
21         }
22         return 0;
23     }
24 }

方式二:递归,代码量小,但耗时更大,LintCode耗时4526ms

 1 public class Solution {
 2     /*
 3      * @param : an integer
 4      * @return: an ineger f(n)
 5      */
 6     public int fibonacci(int n) {
 7         // write your code here
 8        if(n==1){
 9            return 0;
10        }else if(n==2){
11            return 1 ;
12        }else if(n>2){
13            return (fibonacci(n-1) + fibonacci(n-2));
14        }
15        return -1;
16     }
17 }

方式三:将递归改成for循环,用两个变量来存放前两个数,用c来存放结果;LintCode耗时最短2170ms;

 1 public class Solution {
 2     /*
 3      * @param : an integer
 4      * @return: an ineger f(n)
 5      */
 6     public int fibonacci(int n) {
 7         // write your code here
 8        if(n==1){
 9            return 0;
10        }else if(n==2){
11            return 1 ;
12        }else{
13             int a=0;
14             int b=1;
15             int c=0;
16             for(int i=3;i<n+1;i++){
17                 c = a+b;
18                 a=b; //注意先把b赋值给a,在把计算得到的c赋值给b
19                 b=c;
20             }
21             return c;
22        }
23     }
24 }
时间: 2024-10-17 17:41:45

LintCode-查找斐波纳契数列中第 N 个数的相关文章

LintCode Python 入门级题目 斐波纳契数列

原题描述: 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ... 题目分析: 开始的想法,通过递归实现输出fib(n-1)+fib(n-2)的值计算,原理正确,算法复杂度高,导致运行时间超过lintcode限制: class Solution: # @param n: an integer # @retur

斐波纳契数列

查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ... 样例 给定 1,返回 0 给定 2,返回 1 给定 10,返回 34 虽然这道题是一道入门级的题目,可是在第一遍做的时候并没有多想,直接使用的递归,然后数据通过95%,显示的到47的时候就溢出了.经过学习前辈的经验,该题的收获如下: 方法1:使用递归解,

16、【常见算法】查找斐波那契数列的第N项

问题:手写一个函数,用于查找斐波那契数列的第N项目 1 /* 2 查找斐波那契数列的第N个数 3 */ 4 #include <iostream> 5 6 using namespace std; 7 8 int Find(int n) 9 { 10 int a, b; 11 a = 0; 12 b = 1; 13 14 15 for(int i = 1; i < n; i++) 16 { 17 int c = a + b; 18 a = b; 19 b = c; 20 } 21 ret

用PHP迭代器来实现一个斐波纳契数列

斐波纳契数列通常做法是用递归实现,当然还有其它的方法.这里现学现卖,用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次.注释已经写到代码中,也是相当好理解的. <?php /* *@author [email protected] */ class Fibonacci implements Iterator { private $previous = 1; private $current = 0; private $key = 0; public

找斐波那契数列中的第N个数

题目描述 Description 用递归的方法求斐波那契数列中的第N个数 输入输出格式 Input/output 输入格式:一行,一个正整数n输出格式: 一行,一个数,表示斐波那契数列中的第N个数 输入输出样例 Sample input/output 样例测试点#1 输入样例: 15 输出样例: 610 思路:经过讨论,得出斐波那契数列的递归式:f(n-1)+f(n-2),然后直接递归就得了 代码如下(这里用的是long long 类型的,太小会跪……): 1 #include <stdio.h

HDU 4639 Hehe(字符串处理,斐波纳契数列,找规律)

题目 //每次for循环的时候总是会忘记最后一段,真是白痴.... //连续的he的个数 种数 //0 1 //1 1 //2 2 //3 3 //4 5 //5 8 //…… …… //斐波纳契数列 //不连续的就用相乘(组合数)好了 #include<iostream> #include<algorithm> #include<string> #include <stdio.h> #include <string.h> #include &l

002. 斐波那契数列中的偶数

Problem 2: Even Fibonacci numbers Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be: 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... By considering the terms in the Fibo

JAVA基本算法面试题:1斐波纳契数列

开始学习JAVA,基础知识恶补! 斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*). 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 以下是Java代码实现(递归与递推两种方式): import java.util.Scanner;

python之斐波纳契数列

斐波纳契数列 斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........ 这个数列从第3项开始,每一项都等于前两项之和. 示例1: 1 def sum(arg1,arg2,stop): 2 arg3 = arg1 + arg2 3 print(arg3,) 4 if arg3 < 10: 5 sum(ar