蓝蓝计算机考研算法-day07统计每个月兔子总数

119 阅读1分钟

Day07 2023/03/06

有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。 例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。

一月的时候有一只兔子,假如兔子都不死,问第n个月的兔子总数为多少?

输入描述

输入一个int型整数表示第n个月。

输出描述:

输出对应的兔子总数

1、思路

来自大佬 蓝蓝计算机考研算法-day07统计每个月兔子总数 - 掘金 (juejin.cn)

思路1-c++

递归:本质是斐波那契数列:处前两个月外,当月的兔子数为前两个月兔子数之和。

思路2-c++

迭代:三个月以上的设为k3,两个月的设为k2,一个月的设为k1;

每过一个月,k3 += k2; k2 = k1; k1 = k3;

2、具体实现

思路1-C++

#include <iostream>
using namespace std;

int rabitSum1(int month)
{
    if (month == 1 || month == 2)
        return 1;
    else
        return rabitSum1(month - 1) + rabitSum1(month - 2); // 兔子数等于前两个月兔子数之和
}
  • 时间复杂度 O(2^n) --- 遍历整个二叉树结点
  • 时间复杂度 O(n) --- 递归栈的深度为n

思路2-c++

int rabitSum2(int month)
{
    int k1 = 1, k2 = 0, k3 = 0; // 初始化第一个月的数据
    for (size_t i = 2; i <= month; i++)
    {
        k3 += k2;
        k2 = k1;
        k1 = k3;
    }
    return k1 + k2 + k3;
}
  • 时间复杂度 O(n) --- 循环n-1次,n为月份数
  • 空间复杂度 O(1) ---常数级空间

结果

image.png