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))
相关推荐
Tisfy5 分钟前
LeetCode 2187.完成旅途的最少时间:二分查找
算法·leetcode·二分查找·题解·二分
Mephisto.java31 分钟前
【力扣 | SQL题 | 每日四题】力扣2082, 2084, 2072, 2112, 180
sql·算法·leetcode
robin_suli32 分钟前
滑动窗口->dd爱框框
算法
丶Darling.34 分钟前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
labuladuo52044 分钟前
Codeforces Round 977 (Div. 2) C2 Adjust The Presentation (Hard Version)(思维,set)
数据结构·c++·算法
jiyisuifeng19911 小时前
代码随想录训练营第54天|单调栈+双指针
数据结构·算法
꧁༺❀氯ྀൢ躅ྀൢ❀༻꧂1 小时前
实验4 循环结构
c语言·算法·基础题
新晓·故知2 小时前
<基于递归实现线索二叉树的构造及遍历算法探讨>
数据结构·经验分享·笔记·算法·链表
总裁余(余登武)2 小时前
算法竞赛(Python)-万变中的不变“随机算法”
开发语言·python·算法
Eric.Lee20212 小时前
音频文件重采样 - python 实现
人工智能·python·深度学习·算法·audio·音频重采样