LeetCode781 森林中的兔子
问题描述
在一片神秘的森林里,住着许多兔子,但是我们并不知道兔子的具体数量。现在,我们对其中若干只兔子进行提问,问题是 “还有多少只兔子与你(指被提问的兔子)颜色相同?” 我们将每只兔子的回答收集起来,存放在一个整数数组 answers
中,其中 answers[i]
表示第 i
只兔子的回答。我们的任务是根据这个数组,计算出森林中兔子的最少数量。
示例分析
假设 answers = [1, 1, 2]
。
- 有两只兔子回答 “1”,这意味着它们认为还有 1 只兔子和自己颜色相同,所以这两只兔子很可能是同一种颜色,这种颜色的兔子总数为
1 + 1 = 2
只。 - 有一只兔子回答 “2”,它表示还有 2 只兔子和自己颜色相同,那么这种颜色的兔子总数为
2 + 1 = 3
只。 - 综合起来,森林中兔子的最少数量就是
2 + 3 = 5
只。
解题思路
为了计算森林中兔子的最少数量,我们可以根据兔子的回答来分析。如果一只兔子回答有 k
只兔子和它颜色相同,那么包括这只兔子在内,同颜色的兔子一共有 k + 1
只。
我们可以使用哈希表(在 C 语言中可以用数组模拟)来统计每种回答出现的次数。对于每种回答 k
,如果有 n
只兔子都回答 k
,那么至少有 (n + k) / (k + 1)
种不同颜色的兔子群体,每种群体有 k + 1
只兔子。
代码实现
#include <stdio.h>
#include <stdlib.h>#define MAX_ANSWER 1000int numRabbits(int* answers, int answersSize) {int count[MAX_ANSWER + 1] = {0};// 统计每种回答出现的次数for (int i = 0; i < answersSize; i++) {count[answers[i]]++;}int total = 0;// 计算每种颜色的兔子数量for (int i = 0; i <= MAX_ANSWER; i++) {if (count[i] > 0) {// 计算这种颜色的兔子数量int x = i;int cnt = count[i];// 每 (x + 1) 只兔子为一组int groups = (cnt + x) / (x + 1);total += groups * (x + 1);}}return total;
}int main() {int answers[] = {1, 1, 2};int answersSize = sizeof(answers) / sizeof(answers[0]);int result = numRabbits(answers, answersSize);printf("Minimum number of rabbits: %d\n", result); return 0;
}
代码详细解释
1. 头文件与宏定义
#include <stdio.h>
#include <stdlib.h>#define MAX_ANSWER 1000
#include <stdio.h>
:引入标准输入输出库,用于后续的printf
函数输出结果。#include <stdlib.h>
:引入标准库,这里虽然代码中未直接使用库中的函数,但在更复杂的应用场景下可能会用到,提前引入作为储备。#define MAX_ANSWER 1000
:定义一个宏MAX_ANSWER
,表示兔子回答的最大可能值。这有助于后续代码中数组的创建和遍历范围的确定。
2. numRabbits
函数
int numRabbits(int* answers, int answersSize) {int count[MAX_ANSWER + 1] = {0};// 统计每种回答出现的次数for (int i = 0; i < answersSize; i++) {count[answers[i]]++;}int total = 0;// 计算每种颜色的兔子数量for (int i = 0; i <= MAX_ANSWER; i++) {if (count[i] > 0) {// 计算这种颜色的兔子数量int x = i;int cnt = count[i];// 每 (x + 1) 只兔子为一组int groups = (cnt + x) / (x + 1);total += groups * (x + 1);}}return total;
}
int count[MAX_ANSWER + 1] = {0};
:创建一个长度为MAX_ANSWER + 1
的数组count
,用于统计每种回答出现的次数,初始值都设为 0。- 第一个
for
循环:遍历answers
数组,对于每个回答answers[i]
,将count[answers[i]]
的值加 1,从而统计出每种回答出现的次数。 int total = 0;
:初始化一个变量total
,用于存储最终计算出的兔子最少总数。- 第二个
for
循环:遍历count
数组,当count[i] > 0
时,说明有兔子给出了回答i
。int x = i;
和int cnt = count[i];
:将i
赋值给x
,将count[i]
赋值给cnt
,方便后续计算。int groups = (cnt + x) / (x + 1);
:计算至少有多少组颜色相同的兔子群体。total += groups * (x + 1);
:将每组兔子的数量乘以组数,累加到total
中。
3. main
函数
int main() {int answers[] = {1, 1, 2};int answersSize = sizeof(answers) / sizeof(answers[0]);int result = numRabbits(answers, answersSize);printf("Minimum number of rabbits: %d\n", result); return 0;
}
- 定义一个示例数组
answers
,并计算其长度answersSize
。 - 调用
numRabbits
函数计算兔子的最少数量,将结果存储在result
中。 - 使用
printf
函数输出结果。
复杂度分析
- 时间复杂度:代码中有两个主要的
for
循环。第一个循环遍历answers
数组,时间复杂度为 O(n),其中 n 是answers
数组的长度。第二个循环遍历count
数组,由于count
数组的长度是固定的(由MAX_ANSWER
决定),可以看作一个常数,所以这个循环的时间复杂度为O(1)。综合起来,总的时间复杂度为 O(n)。 - 空间复杂度:使用了一个长度为
MAX_ANSWER + 1
的数组count
来统计回答次数,由于MAX_ANSWER
是一个常数,所以空间复杂度为 O(1)。
相关文章:

LeetCode781 森林中的兔子
问题描述 在一片神秘的森林里,住着许多兔子,但是我们并不知道兔子的具体数量。现在,我们对其中若干只兔子进行提问,问题是 “还有多少只兔子与你(指被提问的兔子)颜色相同?” 我们将每只兔子的…...

单硬盘槽笔记本更换硬盘
背景 本人的笔记本电脑只有一个硬盘槽,而且没有M.2的硬盘盒,只有一个移动硬盘 旧硬盘:512G 新硬盘:1T 移动硬盘:512G 参考链接:https://www.bilibili.com/video/BV1iP41187SW/?spm_id_from333.1007.t…...

EB生成配置的过程
EB Tresos Studio,简称EB,通过图形化的模式进行配置生成,并根据选项配置生成配置代码,即 MCAL 层各个模块的配置参数。 在 MCAL 代码中,分为静态代码和配置代码。静态代码,就是 AUTOSAR 规范内容,包含对硬件的封装以及标准化接口的封装;配置代码一般用于配置初始化结构…...

量化交易数据获取:xtquant库的高效应用
量化交易数据获取:xtquant库的高效应用 在量化交易领域,历史行情数据的重要性不言而喻。它不仅为策略回测提供基础,也是实时交易决策的重要参考。本文将介绍如何使用xtquant库来高效获取和处理历史行情数据。 技术背景与应用场景 对于量化…...

哨兵模式与 Redis Cluster:高可用 Redis 的深度剖析
深入探讨 Redis 高可用性解决方案:哨兵模式与 Redis Cluster 一、哨兵模式(Redis Sentinel)深入解析 (一)工作原理详解 哨兵模式通过一个或多个哨兵实例监控 Redis 主从复制集群,确保在主节点发生故障时…...

C++20新特性
作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 C20 是 C 标准中的一个重要版本,引入了许多新特性和改进,包括模块(Modules)、协程…...

电机实验曲线数据提取
处理Python 代码供参考: 1、曲线数据还原 import cv2 import numpy as np import matplotlib.pyplot as plt# 读取图像 image_path 1.png image cv2.imread(image_path) image_copy image.copy() # 创建图像副本,用于叠加显示# 转换为灰度图像 gray cv2.cvtCo…...

windows蓝牙驱动开发-调试及支持的HCI和事件
调试蓝牙配置文件驱动程序 开发蓝牙配置文件驱动程序时,可以使用驱动程序验证程序来协助其调试。 若要启用验证检查,必须为 Bthusb.sys 启用驱动程序验证程序。 如果不执行此操作,将禁用验证检查。 若要完全利用验证检查,请确保…...

Excel大数据量导入导出
github源码 地址(更详细) : https://github.com/alibaba/easyexcel 文档:读Excel(文档已经迁移) B 站视频 : https://www.bilibili.com/video/BV1Ff4y1U7Qc 一、JAVA解析EXCEL工具EasyExcel Java解析、生成Excel比较…...

Linux系统命令无法使用(glib库相关问题)
1.背景描述 Yum强制安装了一些软件,安装软件成功无报错,完成后不久突然发现系统出问题了,所有的命令无法使用了,如ls、mv、cat等基本命令报错。 relocation error: /lib64/libpthread.so.0: symbol_libc_dl_error_tsd …...

Qt修仙之路2-1 仿QQ登入 法宝初成
widget.cpp #include "widget.h" #include<QDebug> //实现槽函数 void Widget::login1() {QString userusername_input->text();QString passpassword_input->text();//如果不勾选无法登入if(!check->isChecked()){qDebug()<<"xxx"&…...

DeepSeek-V3 论文解读:大语言模型领域的创新先锋与性能强者
论文链接:DeepSeek-V3 Technical Report 目录 一、引言二、模型架构:创新驱动性能提升(一)基本架构(Basic Architecture)(二)多令牌预测(Multi-Token Prediction…...

配置#include “nlohmann/json.hpp“,用于处理json文件
#include “nlohmann/json.hpp” // 需要安装 nlohmann/json.hpp 头文件 using json = nlohmann::json; 下载链接:https://github.com/nlohmann/json/tree/develop 1.下载并解压:首先,需要从nlohmann/json的GitHub仓库下载源代码,并解压得到的文件。 地址: nlohmann/json…...

索引失效的14种常见场景
在 MySQL 中,索引有时可能会失效,导致查询性能下降。以下是常见的 14 种场景,在这些场景下,索引可能会失效 1. 使用 OR 连接多个条件 场景: 当查询中包含 OR 时,如果 OR 连接的多个条件中有一个没有使用索引࿰…...

解决com.kingbase8.util.KSQLException: This _connection has been closed.
问题描述 一个消息管理系统,系统采用kingbase8数据库,数据库采用单体模式,后台应用也采用springboot单体模式。系统正式上线后,出现几个JDBC响应的异常信息: com.kingbase8.util.KSQLException: An I/O error occurred while sending to the backend.java.net.SocketTime…...

openAI官方prompt技巧(二)
1. 赋予 ChatGPT 角色 为 ChatGPT 指定一个角色,让其从特定的身份或视角回答问题。这有助于生成针对特定受众或场景的定制化回答。 例如: 你是一名数据分析师,负责我们的市场营销团队。请总结上个季度的营销活动表现,并强调与未…...

【非 root 用户下全局使用静态编译的 FFmpeg】
在非 root 用户下全局使用静态编译的 FFmpeg,可以按照以下方法操作: 1. 下载静态编译的 FFmpeg 如果你还没有下载静态编译的 FFmpeg,可以从官方网站获取: wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd6…...

【嵌入式 Linux 音视频+ AI 实战项目】瑞芯微 Rockchip 系列 RK3588-基于深度学习的人脸门禁+ IPC 智能安防监控系统
前言 本文主要介绍我最近开发的一个个人实战项目,“基于深度学习的人脸门禁 IPC 智能安防监控系统”,全程满帧流畅运行。这个项目我目前全网搜了一圈,还没发现有相关类型的开源项目。这个项目只要稍微改进下,就可以变成市面上目前…...

前端布局与交互实现技巧
前端布局与交互实现技巧 1. 保持盒子在中间位置 在网页设计中,经常需要将某个元素居中显示。以下是一种常见的实现方式: HTML 结构 <!doctype html> <html lang"en"> <head><meta charset"UTF-8"><m…...

idea 找不到或者无法加载主类
idea项目,之前一直是正常运行的,放假了之后再回来就遇到启动不了的问题。 WebApplication这个类右键运行的时候,也提示找不到主类。 对于这种之前运行没有问题,突然出问题的项目。 我的点是没有改动代码和数据的情况下项目就跑不起…...

Flink 调用海豚调度器 SQL 脚本实现1份SQL流批一体化的方案和可运行的代码实例
目录 一、流批一体化概述 二、Flink 与海豚调度器结合实现流批一体化的好处 2.1 代码复用性增强 2.2 开发和维护成本降低 2.3 数据一致性保证 2.4 提高系统的灵活性和可扩展性 三、实现思路步骤 3.1 环境准备 3.2 编写 SQL 脚本并上传到海豚调度器 3.3 实现资源下载功…...

ES6 Map 数据结构是用总结
1. Map 基本概念 Map 是 ES6 提供的新的数据结构,它类似于对象,但是"键"的范围不限于字符串,各种类型的值(包括对象)都可以当作键。Map 也可以跟踪键值对的原始插入顺序。 1.1 基本用法 // 创建一个空Map…...

go结构体详解
结构体简介 Golang 中没有“类”的概念,Golang 中的结构体和其他语言中的类有点相似。和其他面向对象语言中的类相比,Golang 中的结构体具有更高的扩展性和灵活性。 Golang 中的基础数据类型可以表示一些事物的基本属性,但是当我们想表达一…...

机器学习-关于线性回归的表示方式和矩阵的基本运算规则
最近在学习机器学习的过程中,发现关于线性回归的表示和矩阵的运算容易费解,而且随着学习的深入容易搞混,因此特意做了一些研究,并且记录下来和大家分享。 一、线性模型有哪些表示方式? 器学习中,线性模型…...

kafka 3.5.0 raft协议安装
前言 最近做项目,需要使用kafka进行通信,且只能使用kafka,笔者没有测试集群,就自己搭建了kafka集群,实际上笔者在很早之前就搭建了,因为当时还是zookeeper(简称ZK)注册元数据&#…...

后台管理系统网页开发
CSS样式代码 /* 后台管理系统样式文件 */ #container{ width:100%; height:100%; /* background-color:antiquewhite;*/ display:flex;} /* 左侧导航区域:宽度300px*/ .left{ width:300px; height: 100%; background-color:#203453; display:flex; flex-direction:column; jus…...

使用一个大语言模型对另一个大语言模型进行“调教”
使用一个大语言模型对另一个大语言模型进行“调教”(通常称为微调或适配),是一种常见的技术手段,用于让目标模型更好地适应特定的任务、领域或风格。以下是基于搜索结果整理的详细步骤和方法: 1.准备工作 安装必要的…...

golang使用sqlite3,开启wal模式,并发读写
因为sqlite是基于文件的,所以默认情况下,sqlite是不支持并发读写的,即写操作会阻塞其他操作,同时sqlite也很容易就产生死锁。 但是作为一个使用广泛的离线数据库,从sqlite3.7.0版本开始(SQLite Release 3.…...

如何利用maven更优雅的打包
最近在客户现场部署项目,有两套环境,无法连接互联网,两套环境之间也是完全隔离,于是问题就来了,每次都要远程到公司电脑改完代码,打包,通过网盘(如果没有会员,上传下载慢…...

音频进阶学习十二——Z变换一(Z变换、收敛域、性质与定理)
文章目录 前言一、Z变换1.Z变换的作用2.Z变换公式3.Z的状态表示1) r 1 r1 r12) 0 < r < 1 0<r<1 0<r<13) r > 1 r>1 r>1 4.关于Z的解释 二、收敛域1.收敛域的定义2.收敛域的表示方式3.ROC的分析1)当 …...