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

力扣每日打卡16 781. 森林中的兔子(中等)

力扣 781. 森林中的兔子 中等

  • 前言
  • 一、题目内容
  • 二、解题方法
    • 1. 哈希函数(来自评论区大佬的解题方法)
    • 2.官方题解
      • 2.1 方法一:贪心


前言

这是刷算法题的第十六天,用到的语言是JS
题目:力扣 781. 森林中的兔子 (中等)


一、题目内容

森林中有未知数量的兔子。提问其中若干只兔子 “还有多少只兔子与你(指被提问的兔子)颜色相同?” ,将答案收集到一个整数数组 a n s w e r s answers answers 中,其中 a n s w e r s [ i ] answers[i] answers[i] 是第 i i i 只兔子的回答。

给你数组 a n s w e r s answers answers ,返回森林中兔子的最少数量。

示例 1:

输入:answers = [1,1,2]
输出:5
解释:
两只回答了 “1” 的兔子可能有相同的颜色,设为红色。
之后回答了 “2” 的兔子不会是红色,否则他们的回答会相互矛盾。
设回答了 “2” 的兔子为蓝色。
此外,森林中还应有另外 2 只蓝色兔子的回答没有包含在数组中。
因此森林中兔子的最少数量是 5 只:3 只回答的和 2 只没有回答的。
示例 2:

输入:answers = [10,10,10]
输出:11

提示:

1 < = a n s w e r s . l e n g t h < = 1000 1 <= answers.length <= 1000 1<=answers.length<=1000
0 < = a n s w e r s [ i ] < 1000 0 <= answers[i] < 1000 0<=answers[i]<1000

二、解题方法

1. 哈希函数(来自评论区大佬的解题方法)

挺好想的吧,第i个兔子回答有x个相同的亲兄弟,加上它自己,这种兔子至少有x + 1个,当第j个兔子也回答有x个亲兄弟时,其实就两种情况:

  1. 第j个兔子和第i个兔子同属一个阵营,它们互为亲兄弟
  2. 第j个兔子和第i个兔子不属于同一个阵营,它们不是亲兄弟

下面具体分析:
当有兔子回答x时,一定存在一个最多容纳x+1个兔子的兔子阵营,且同属于一个阵营的兔子的回答都是一样的,都是x,因此我们记录有多少只兔子回答了x,即mp[x] = y就表示有y只兔子回答了 x
解释为:一个最多容纳x+1只兔子的兔子阵营,找到了y只兔子在这个阵营中,y == 1表示这个阵营第一次出现,而当y == x + 1时表示这个阵营已经满了,后续还有兔子回答x时已经是另一个新阵营的兔子了,咱们只在y == 1时收集答案,即只出现新阵营时才收集答案,这样就避免了重复计算了和漏计算

代码如下(示例):

/*** @param {number[]} answers* @return {number}*/
var numRabbits = function (answers) {// 哈希表?let count = 0const map = new Map()for (const x of answers) {// 记录当前答案出现的次数, 一开始是0,首次添加时为1map.set(x, (map.get(x) || 0) + 1)if (map.get(x) > x + 1) map.set(x, 1) // 产生了新的颜色阵营if (map.get(x) === 1) count += x + 1 // 出现新阵营 或者 答案次数只有1的话,就加上阵营的兔子数量// 补充,为什么两个if调换顺序就出问题// 调换后,错误的新增计数: // 假设某个颜色(兔子回答) x 的出现次数当前为 x + 1,而这时有另一个兔子也说 x。因为我们先检查了 map.get(x) === 1,会在这个时候错误地将这个阵营的数量加到 count 中,即使它实际上应该被标记为已满。// 没有正确重置计数:// 如果没有首先检查是否超过最大次数(x + 1),那么我们就无法及时重置计数为 1,而是错误地累加到现有计数基础上,这会导致最终的计数不准确,增加了不该计数的兔子。}return count
}

2.官方题解

2.1 方法一:贪心

cv

代码如下(示例):

var numRabbits = function(answers) {const count = new Map();for (const y of answers) {count.set(y, (count.get(y) || 0) + 1);}let ans = 0;for (const [y, x] of count.entries()) {ans += Math.floor((x + y) / (y + 1)) * (y + 1);}return ans;
};作者:力扣官方题解
链接:https://leetcode.cn/problems/rabbits-in-forest/solutions/698444/sen-lin-zhong-de-tu-zi-by-leetcode-solut-kvla/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复杂度分析:
时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组 a n s w e r s answers answers 的长度。
空间复杂度: O ( n ) O(n) O(n)。最坏情况下,哈希表中含有 n n n 个元素。

链接:力扣本题官方题解
来源:力扣(LeetCode)

相关文章:

  • 4月20日星期日今日早报简报微语报早读
  • 微服务架构中的关键技术选型:深入探讨Nacos与Dubbo
  • 【中间件】nginx将请求负载均衡转发给网关,网关再将请求转发给对应服务
  • 数据通信学习笔记之OSPF其他内容2
  • @Primary 注解的作用
  • 使用 PCL 和 Qt 实现点云可视化与交互
  • [dp22_二维背包] 一和零 | 盈利计划
  • Python网络爬虫设计(三)
  • 【QT】 QT中的列表框-横向列表框-树状列表框-表格列表框
  • 【JavaWeb后端开发02】SpringBootWeb + Https协议
  • vuex实现同一页面radio-group点击不同按钮显示不同表单
  • Redis——内存策略
  • 数据通信学习笔记之OSPF的邻居角色
  • 【漫话机器学习系列】213.随机梯度下降(SGD)
  • 大学之大:布里斯托大学2025.4.20
  • From RAG to Memory: Non-Parametric Continual Learning for Large Language Models
  • SpringCloud实战
  • 征程 6 VIO 通路断流分析
  • 内容合作方资源哪里找?如何管理?
  • 每日面试实录·携程·社招·JAVA
  • 海拔四百公里的救赎
  • 全球南方声势卓然壮大的历史逻辑——写在万隆会议召开70周年之际
  • 人民网评:“中国传递爱而不是关税”
  • 文理医工“四轮驱动”,复旦六大新工科创新学院核心团队均亮相
  • 卡洛·金茨堡:女巫与萨满——我的学术之路
  • 人民日报和音:开启中马关系新的“黄金五十年”