4.每日LeetCode-数组类,斐波那契数(Go,Java,Python)

题目

复制代码
题号:509斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。

示例 1:
输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1

示例 2:
输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2

示例 3:
输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3

例如:
 0 1 1 2 3 5 8 13 21 斐波那契数列
 0 1 2 3 4 5 6 7  8 下标

解法

Go

Go 复制代码
package main

import "fmt"


// 使用递归,并用map保存已经求解过的值
func fib1(n int) int {
	mp := make(map[int]int, n-2)
	if n <= 1 {
		return n
	}
	if _, ok := mp[n]; ok {
		return mp[n]
	} else {
		rst := fib(n-1) + fib(n-2)
		mp[n] = rst
		return rst
	}
}

// 使用for循环,用两个变量记录上次和上上次的值,时间复杂度O(n)
func fib(n int) int {
	if n <= 1 {
		return n
	}
	rst := 0
	pre := 1
	prepre := 0
	for i := 2; i <= n; i++ {
		rst = pre + prepre
		prepre = pre
		pre = rst
	}
	return rst
}

func main() {
	fmt.Println(fib(7))
}

Java

java 复制代码
package org.example;

import java.util.HashMap;
import java.util.Map;

public class Fibonacci {

    // 使用递归,并用map保存已经求解过的值
    private Map<Integer, Integer> mp = new HashMap<>();

    public int fib1(int n) {
        if (n == 0) return 0;
        if (n == 1) return 1;
        if (mp.get(n) != null) {
            return mp.get(n);
        } else {
            int val = fib1(n - 1) + fib1(n - 2);
            mp.put(n, val);
            return val;
        }
    }

    // 使用for循环,用两个变量记录上次和上上次的值,时间复杂度O(n)
    public int fib(int n) {
        if (n == 0) return 0;
        if (n == 1) return 1;
        int sum = 0, pre = 1, prepre = 0;
        for (int i = 2; i <= n; i++) {
            sum = pre + prepre;
            prepre = pre;
            pre = sum;
        }
        return sum;
    }

}

Python

python 复制代码
dic = {}

def fib(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    if n in dic:
        return dic[n]
    else:
        val = fib(n - 1) + fib(n - 2)
        dic[n] = val
        return val


# 使用for循环,用两个变量记录上次和上上次的值,时间复杂度O(n)
def fib1(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    sum = 0
    pre = 1
    prepre = 0
    for i in range(2, n + 1):
        sum = pre + prepre
        prepre = pre
        pre = sum
    return sum


if __name__ == '__main__':
    print(fib(7))
    print(fib1(7))
相关推荐
hweiyu0031 分钟前
C++设计模式,高级开发,算法原理实战,系统设计与实战(视频教程)
c++·算法·设计模式
大千AI助手1 小时前
粒子群优化(PSO)算法详解:从鸟群行为到强大优化工具
人工智能·算法·优化算法·pso·粒子群优化
我叫汪枫1 小时前
C语言深度入门系列:第十一篇 - 动态内存管理与数据结构:程序世界的高效算法大师
c语言·数据结构·算法
Li_7695321 小时前
优选算法100 题 ——1 双指针
算法
77qqqiqi1 小时前
算法——数学基础
算法
啊?啊?1 小时前
7 排序算法通关指南:从 O (n²)(选择 / 冒泡)到 O (nlogn)(快排 / 归并)+ 计数排序
数据结构·算法·排序算法
张较瘦_1 小时前
[论文阅读] 算法 | 抗量子+紧凑!SM3-OTS:基于国产哈希算法的一次签名新方案
论文阅读·算法·哈希算法
芒克芒克1 小时前
LeetCode 面试经典 150 题:多数元素(摩尔投票法详解 + 多解法对比)
算法·leetcode·面试
wow_DG1 小时前
【Vue2 ✨】Vue2 入门之旅 · 进阶篇(二):虚拟 DOM 与 Diff 算法
开发语言·javascript·vue.js·算法·前端框架
和光同尘 、Y_____2 小时前
BRepMesh_IncrementalMesh 重构生效问题
c++·算法·图形渲染