Fibonacci数列


 


 

解题思路:

  第一步:了解问题的数据规模

    由题可以看出n的范围比较大,Fn的范围也很大,所以我们的数据类型尽量考虑long型,同时也排除用递归的解法,因为递归的解法时间复杂度比较高

  第二步:选择合适的解法

    解法1:开辟数组的解法(具体思路在代码中呈现)

    解法2:滚动数组的解法(具体思路在代码中呈现)

    这里我优先考虑用滚动数组的解法,因为时间复杂度O(n)级别,空间复杂度为O(1)级别,即能节省空间,又能节省时间

代码实现:

  

//开辟数组的方式
    public static  long  fib1 (int n){
      //由于是从1开始而且还要最少存储3个元素因此数组长度为n+2.
      long[] fibs = new long[n+2];
      fibs[0] = 0;
      fibs[1] = 1;
      fibs[2] = 1;
      // 从第三个开始遍历, fibs[0] = 0;用不到
      for (int i = 3; i <=n; i++) {
          // 只存储余数即可
          fibs[i] = (fibs[i-1] + fibs[i-2]) % 10007;
      }
      return fibs[n];
    }

 

  //滚动数组的方式
    public static long fib2(int n){
        //创建一个长度为3的滚动数组,并进行初始化
        long[] fibs ={0,1,1};
        //由于n=1时和n=2时不用进行滚动,所以直接返回就行
        if(n==1||n==2)  return 1;
        //由于第1次滚动会得出n=3的fib数,第2次滚动会得出n=4的fib数,所以第n-2次滚动会得出n的fib数
        for(int i=1;i<=n-2;i++){
            fibs[0]=fibs[1];
            fibs[1]=fibs[2];
            fibs[2]=(fibs[0]+fibs[1])%10007;  //根据题意,只存储余数即可
        }
        return fibs[2];
    }

 

 

 2020-03-27

posted @ 2020-03-27 17:31  木原纺  阅读(147)  评论(0编辑  收藏  举报