zoukankan      html  css  js  c++  java
  • 剑指Offer:斐波那契数列

    剑指Offer:斐波那契数列

    题目描述:
    写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:

    F(0) = 0,   F(1) = 1
    F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
    

    斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
    答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

    解题思路1:

    1. 开始想的是用数组,但是不知道总的数据个数,显然不行,然后想到vector容器;
    2. 而该算法公式是需要访问最后一个数据和倒数第二个数据,然而vector不支持寻找倒数第二个数据(不存在这样的迭代器);
    3. 但vector能够通过[]进行访问添加数据,即可以通过循环得出最后的和a.[i]=a[i-1]+a[i-2]。

    注意:

    1. 只保留最后两个数据,是不是用vector过于浪费内存;
    2. 在循环体中,未进行取模操作,导致数据超出内存容量。
    class Solution {
    public:
        int fib(int n) 
        {
            if (n <= 1) return n;
            vector<int> dp(n + 1);
            dp[0] = 0, dp[1] = 1;
            for (int i = 2; i <= n; ++i) 
            {
                dp[i] = (dp[i - 1] + dp[i - 2]) % 1000000007;
            }
            return dp[n];
        }
    };
    

    解题思路2:
    通过变量不断变化,存储前两个数值,实现累加;

    class Solution {
    public:
        int fib(int n) {
            if (n <= 1) return n;
            int a = 0, b = 1, res = 0;        
            for (int i = 2; i <= n; ++i) {
                res = (a + b) % 1000000007;
                a = b;	//a,b都更新
                b = res;        
            }
            return res;
        }
    };
    
  • 相关阅读:
    消息中间件三、RabbitMQ学习一
    消息队列学习一 概念
    发送网络请求调用第三方接口(spring boot框架)
    动态生成javaBean
    达梦dm数据库远程备份与恢复
    springboot定时任务的使用
    抽象与接口
    电商网站后台九大功能模块详解
    面向对象设计—类和对象
    常用的数据结构—数组
  • 原文地址:https://www.cnblogs.com/Tavi/p/12514041.html
Copyright © 2011-2022 走看看