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))
相关推荐
云-缩影1 小时前
实际项目中怎么选排序算法:从面试题到工程落地
java·算法·排序算法
Pniubi2 小时前
力扣46全排列(回溯(递归))
算法·leetcode·职场和发展
文丑颜不良啊2 小时前
LeetCode1461~1480题目解析
java·leetcode
ZhengEnCi11 小时前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
秋天的怀念_David12 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Pniubi12 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
hhb_61812 小时前
大模型落地三重优化实战
人工智能·算法·机器学习
云和数据.ChenGuang12 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
2601_9707038314 小时前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
心中有你021414 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法