[leetcode]Rabbits in Forest

版权声明:转载请注明作者及原文链接,万谢。 https://blog.csdn.net/changanyi/article/details/79321328

原题&翻译

In a forest, each rabbit has some color. Some subset of rabbits (possibly all of them) tell you how many other rabbits have the same color as them. Those answers are placed in an array.

森林内,每个兔子都有颜色。其中一些或者每只兔子会告诉你有对少只和自己颜色相同的兔子。这些回答放置于一个数组中.

Return the minimum number of rabbits that could be in the forest.

返回这片森林最少可能有多少只兔子。

案例:
输入: 回答 = [1, 1, 2]
输出: 5

分析:
两只兔子回答 “1” ,说明至少有两只兔子同色,比如红色什么的。
有一只兔子说了 “2” ,肯定不会是红色的兔子(上面分析出红色只有两只).
所以回答 “2” 的肯定是别的颜色的兔子,比如是蓝色。
最小可能值就是5 : 3 只蓝色 2 只红色。

输入: 回答 = [10, 10, 10]
输出: 11
输入: 回答 = []
输出: 0
  1. 回答不超过 1000.

  2. 每个 answers[i] 在 [0, 999] 范围内.


解题思路

这个是比较无耻的,很无聊很无聊的方法。

分析一下,
1. 如果说 2 的兔子三只,那么至少三只兔子,每一只都满足条件
2. 同理,如果说 2 的兔子 1-3 只,至少三只兔子。
3. 其他回答同理。

class Solution {
public:
    int numRabbits(vector<int>& answers) {
        int sum = 0;
        vector<int> mac(1000,0);
        for(int i=0;i<answers.size();i++){
            mac[answers[i]]++;
        }
        for(int i=0;i<1000;i++){
            if(mac[i]==0) continue; 
            sum += (i+1) * (mac[i]/(i+1) + (((mac[i]%(i+1))>0)?1:0));
        }
        return sum;
    }
};

第二种方式

这个是 leetcode 上的另一种方式,其实原理一样,只不过用了 STL,比上面的强很多。

    int numRabbits(vector<int>& a) {
        unordered_map<int,double> m;
        for (int i = 0; i < a.size (); i++) m[a[i]+1]++;
        int res = 0;
        for (auto e : m) res += ceil (e.second/e.first) * e.first;
        return res;
    }

本文虽拙,却也系作者劳动,转载还请保留本文链接: http://cyleft.com/?p=531

阅读更多

没有更多推荐了,返回首页