题解 | #统计每个月兔子的总数#

统计每个月兔子的总数

http://www.nowcoder.com/practice/1221ec77125d4370833fd3ad5ba72395

题目主要信息

1、有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问第n个月的兔子总数为多少?

2、本题有多组数据。

方法一:斐波那契数列

具体方法

我们可以先来推导一个

第一个月 只有一对

第二个月 只有一对

第三个月 原先的一对生出一对 共2对

第四个月 最开始的一对又生出一对 共3对

第五个月 第一对生一对,第二队到第三月 生一对,共5对

第六个月 第一对生一对,第二对生一对,第三对生一对,共8对

可以发现f(n) = f(n-1)+f(n-2)

alt

Java代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()){
            int n = sc.nextInt();
            System.out.println(f(n));
        }
    }
    public static int f(int n){
        if(n == 1 || n == 2){
            return 1;
        }
        return  f(n-1)+f(n-2);
    }
}

复杂度分析:

  • 时间复杂度:O(2n)O(2^n),如图所示,树型递归,遍历每个结点
  • 空间复杂度:O(n)O(n),递归栈最大深度为n

方法二:动态规划

具体做法

设第n个月的兔子数量为num[n],第n个月有第n-1个月已有的兔子,同时,可能会有新出生的兔子。由题目可知,每只兔子在第三个月都会生一只兔子,所以第n个月出生的兔子数量等于第n-2月时的兔子数量,即num[n]=num[n-1]+num[n-2]。

Java代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()){
            int n = sc.nextInt();
            System.out.println(dp(n));
        }
    }
    public static int dp(int n){
        int num[] = new int[n+1];
        num[1] = 1;
        num[2] = 1;
        for(int i=3;i<=n;i++){
            num[i] = num[i-1] + num[i-2];
        }
        return  num[n];
    }
}

复杂度分析

  • 时间复杂度:O(n)O(n),动态规划需要遍历一遍。
  • 空间复杂度:O(n)O(n),动态规划数组大小为n。
华为机试 文章被收录于专栏

本专栏主要用于分享华为机试的题解,希望对大家有所帮助。

全部评论
动态规划有点东西
点赞 回复 分享
发布于 2024-10-10 19:31 山东
动态规划方式 int num[] = new int[n+1];改为 int num[] = new int[n+2]; 不然n=1时会有数组越界问题
点赞 回复 分享
发布于 2024-04-19 14:48 江苏
居然是斐波拉契数列。。。
点赞 回复 分享
发布于 2023-06-08 20:43 重庆
你是个人才,这都能找到规律!
点赞 回复 分享
发布于 2023-04-19 12:52 安徽
动态规划法可以,可惜没学过,第一次知道是在力扣,第二次是牛客
点赞 回复 分享
发布于 2023-03-06 17:59 广东
第一个方法 n<3的时候会出问题哦
点赞 回复 分享
发布于 2022-08-19 11:26 北京

相关推荐

08-08 16:33
唐山学院 Java
职场水母:首先,简历太长,对于实习和应届找工作,hr一眼扫的是学历,技术看实习,你写的技术栈字太多了,尽量用一句话概括不用写那么详细,技术面的时候会问的,而且技术栈都会在实习或者项目里体现,你要做的是,把你的简历浓缩为一页,删除没用的东西,比如实践经历,自我评价,这些纯废话,没用,专业技能写的太离谱,你真的熟练掌握了吗,建议都写熟悉,找工作和写论文不一样,追求的是干练和实用,把实习经历和项目提前,把掌握的技术栈写到最后,然后去找实习,
点赞 评论 收藏
分享
评论
107
24
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务