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))
相关推荐
passer__jw76712 分钟前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
Ocean☾18 分钟前
前端基础-html-注册界面
前端·算法·html
顶呱呱程序26 分钟前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
爱吃生蚝的于勒1 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~1 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
王哈哈^_^1 小时前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
星沁城1 小时前
240. 搜索二维矩阵 II
java·线性代数·算法·leetcode·矩阵
脉牛杂德2 小时前
多项式加法——C语言
数据结构·c++·算法
legend_jz2 小时前
STL--哈希
c++·算法·哈希算法
kingmax542120082 小时前
初三数学,最优解问题
算法