[leetcode 781. 森林中的兔子] | 刷题打卡

311 阅读2分钟

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述

leetcode 781. 森林中的兔子

森林中,每个兔子都有颜色。其中一些兔子(可能是全部)告诉你还有多少其他的兔子和自己有相同的颜色。我们将这些回答放在 answers 数组里。

返回森林中兔子的最少数量。

示例:

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

说明:

answers 的长度最大为1000。
answers[i] 是在 [0, 999] 范围内的整数。

二、思路分析

  • 求的是最少数量,所以答案中相同的回答优先按是同种颜色考虑,如有 2(m)只回答 2(n),则相同颜色最少是 3(n + 1) 只。所以先要对数据中的答案进行统计汇总。
  • 统计汇总后计数可能大于答案,如有 3(m)只回答 2(n),最少就还是是 3(n + 1)只;如有 4(m)只回答 2(n),多出的 1 只还有 2 只与它颜色一致,则最少有 6 只。
  • 总结规律得出计算公式
回答 2
计数 1 2 3 4 5 6 7
最少 3 3 3 6 6 6 9

总数等于 n + 1 的倍数,倍数是 m / (n + 1) 的向上取整。

num = Math.ceil(m / (n + 1)) * (n + 1)
  • 特殊情况,回答 0 ,没有一样颜色的兔子,则计数多少就是多少兔子。没有答案的空数组,则没有兔子。

三、参考代码

/**
* @param {number[]} answers
* @return {number}
*/
var numRabbits = function(answers) {
    if(answers == []) return 0;
    let type = [];
    let same = {};
    answers.forEach((item,index) => {
        if(same[item]) {
            same[item] ++;
        } else {
            same[item] = 1;
            type.push(item);
        }
    });
    let all = 0;
    type.forEach((item,index) => {
        if(item == 0) {
            all += same[item];
        } else {
            all += (Math.ceil(same[item] / (item + 1)) * (item + 1));
        }
    });
    return all;
};

执行结果

执行结果:通过
执行用时:84 ms, 在所有 JavaScript 提交中击败了83.67%的用户
内存消耗:39.1 MB, 在所有 JavaScript 提交中击败了77.55%的用户

四、总结

此题目结果比较有规律可循,根据结果找规律可总结出计算公式,再对公式进行验证,找到一些边界情况即可通过。