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))
相关推荐
STY_fish_201227 分钟前
P11855 [CSP-J2022 山东] 部署
算法·图论·差分
myw07120528 分钟前
湘大头歌程-Ride to Office练习笔记
c语言·数据结构·笔记·算法
H_BB29 分钟前
算法详解:滑动窗口机制
数据结构·c++·算法·滑动窗口
Zero-Talent31 分钟前
“栈” 算法
算法
橘子编程31 分钟前
经典排序算法全解析
java·算法·排序算法
waeng_luo32 分钟前
【鸿蒙开发实战】智能数据洞察服务:待回礼分析与关系维护建议算法
算法·ai编程·鸿蒙
风筝在晴天搁浅32 分钟前
代码随想录 279.完全平方数
算法
不穿格子的程序员35 分钟前
从零开始刷算法——字串与区间类经典题:前缀和 + 单调队列双杀
算法·前缀和·哈希表·双向队列·单调队列
坚持就完事了36 分钟前
十大排序算法
数据结构·算法·排序算法
面试鸭44 分钟前
2025 校招生最想去的公司,秋招薪资汇总
计算机·职场和发展·互联网