剑指 Offer 10- I. 斐波那契数列

 

本题如果用递归做,超时。注意要对结果取余。递归+记忆可以通过。如下:

 1 class Solution {
 2     int[] arr=new int[101];
 3     {//这里不加大括号会报错
 4       Arrays.fill(arr,-1);
 5     }
 6     public int fib(int n) {
 7        if(n<=1)
 8           return n;
 9         if(arr[n] != -1){
10          return arr[n];
11     }else{
12        
13         arr[n] = fib(n-1) + fib(n-2);
14         arr[n]=arr[n]% 1000000007;
15          return arr[n];
16 
17     }
18 }
19 
20     
21 }
View Code

本题其实还是动态规划的经典例子,看了半天背包问题没看懂,崩溃。但其实本题的迭代解还是很好理解的,可以优化到开一个n维数组,再可以优化到不开数组,因为只要取最后的结果,计算出最后结果的那些数其实不用记录下来(记下结果前的两个数即可):

class Solution {
    public int fib(int n) {
        if(n<=1)
            return n;
        int sum=0,a=0,b=1;
        for(int i=2;i<=n;i++){
            sum=(a+b)%1000000007;
            a=b;
            b=sum;

        }
        return sum;
    }
}
View Code

 

posted @ 2021-03-10 22:42  wsshub  阅读(44)  评论(0)    收藏  举报