当前位置: 首页 > ds >正文

LeetCode每日一题4.20

781.森林中的兔子

问题

在这里插入图片描述

问题分析

根据题目描述,我们需要解决的问题是:给定一个数组 answers,其中每个元素表示某只兔子回答的“还有多少只兔子与你颜色相同”,要求返回森林中兔子的最少数目。

思路

理解 answers 数组:
answers[i] = x 表示第 i 只兔子回答说还有 x 只兔子与它的颜色相同。
因此,每种颜色的兔子数量为 x + 1(包括它自己)。
统计每种回答的频率:
使用一个字典来统计每种回答(即 x)出现的次数。
计算每种颜色的兔子数量:
对于每种回答 x,如果其出现次数为 freq,则该颜色的兔子数量为 k * (x + 1),其中 k 是使得 k * (x + 1) >= freq 的最小整数。
汇总所有颜色的兔子数量:
将每种颜色的兔子数量相加,得到总数。

代码

class Solution:def numRabbits(self, answers: List[int]) -> int:# 统计每种回答的频率count = Counter(answers)total_rabbits = 0for answer, freq in count.items():# 每种颜色的兔子数量为 (answer + 1)rabbits_per_color = answer + 1# 需要的颜色组数color_groups = (freq + rabbits_per_color - 1) // rabbits_per_color# 该颜色的兔子总数total_rabbits += color_groups * rabbits_per_colorreturn total_rabbits

复杂度分析

时间复杂度:O(n)(其中 n 是 answers 的长度)
空间复杂度:O(m)(其中 m 是 answers 中不同元素的数量)

学习

导入必要的模块:
Counter 用于统计 answers 中每个元素的频率。
定义 Solution 类和 numRabbits 方法:
numRabbits 方法接收一个列表 answers 作为参数。
统计每种回答的频率:
使用 Counter(answers) 得到每个回答的频率。
计算总兔子数:
遍历 count 字典,对于每种回答 answer 和其频率 freq:
计算每种颜色的兔子数量 rabbits_per_color = answer + 1。
计算需要的颜色组数 color_groups = (freq + rabbits_per_color - 1) // rabbits_per_color。
累加该颜色的兔子总数 total_rabbits += color_groups * rabbits_per_color。
返回结果:
最终返回 total_rabbits 作为结果。

color_groups = (freq + rabbits_per_color - 1) // rabbits_per_color

这行代码的目的是计算对于特定的 answer(即特定的 rabbits_per_color),需要多少组这样的兔子来覆盖所有的 freq 只兔子。
示例:

示例 1:answers = [1, 1, 2]
answer = 1 时,freq = 2(有两个 1),rabbits_per_color = 2。
color_groups = (2 + 2 - 1) // 2 = 3 // 2 = 1,即需要 1 组 2 只兔子。
answer = 2 时,freq = 1(有一个 2),rabbits_per_color = 3。
color_groups = (1 + 3 - 1) // 3 = 3 // 3 = 1,即需要 1 组 3 只兔子。
示例 2:answers = [10, 10, 10]
answer = 10 时,freq = 3(有三个 10),rabbits_per_color = 11。
color_groups = (3 + 11 - 1) // 11 = 13 // 11 = 1,即需要 1 组 11 只兔子。
4. total_rabbits += color_groups * rabbits_per_color
最后,将每种颜色组的兔子数量累加到 total_rabbits 中,得到最终的兔子总数。

http://www.xdnf.cn/news/749.html

相关文章:

  • SSRF学习
  • 【Agent】AI智能体评测基座AgentCLUE-General
  • 21.Chromium指纹浏览器开发教程之触摸屏点指纹定制
  • RHCSA Linux 系统文件内容显示2
  • 云梦数字化系统 介绍
  • 2025 第十六届蓝桥杯Java B组
  • 信号的概念
  • 《软件设计师》复习笔记(2.4)——输入输出、中断、总线、可靠性
  • TensorFlow介绍
  • 漫游git rebase + 浅谈git checkout和git branch -f的分支命令
  • Linux内核哈希表学习笔记
  • Vue3 + TypeScript + Pinia 搭建一套企业级的开发脚手架
  • 数字化时代下的工业物联网智能体开发平台策略
  • Vue3中provide和inject数据修改规则
  • 代码随想录训练营第36天 ||1049. 最后一块石头的重量 II 494. 目标和 474. 一和零
  • C++——智能指针
  • 防抖与节流的理解与应用
  • 【C++】win 10 / win 11:Dev-C++ 下载与安装
  • 数据结构实验7.1:二叉树的遍历
  • C语言strlen和sizeof区分
  • Cadence学习笔记之---库元件制作、元件放置
  • TDengine 性能监控与调优实战指南(二)
  • 指针(2)
  • Linux 网络基础(二) (传输协议层:UDP、TCP)
  • cloudstudio学习笔记之openwebui
  • 嵌入式面试题解析:二维数组,内容与总线,存储格式
  • iwebsec靶场 文件包含关卡通关笔记11-ssh日志文件包含
  • Boost.Asio 确实属于 异步非阻塞模型
  • 多模态大语言模型arxiv论文略读(三十一)
  • 高并发场景下重试策略的演进设计