【LeetCode每日一題】森林中的兔子

森林中的兔子

一、題目描述

森林中,每一個兔子都有顏色。其中一些兔子(多是所有)告訴你還有多少其餘的兔子和本身有相同的顏色。咱們將這些回答放在 answers 數組裏。

返回森林中兔子的最少數量。
示例:
輸入: answers = [1, 1, 2]
輸出: 5
解釋:
兩隻回答了 "1" 的兔子可能有相同的顏色,設爲紅色。
以後回答了 "2" 的兔子不會是紅色,不然他們的回答會相互矛盾。
設回答了 "2" 的兔子爲藍色。
此外,森林中還應有另外 2 只藍色兔子的回答沒有包含在數組中。
所以森林中兔子的最少數量是 5: 3 只回答的和 2 只沒有回答的。

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

輸入: answers = []
輸出: 0

二、算法思想

算法思想:    
    一、把喊到相同個數的兔子拎出來,讓他們一組,按照他們說的那個數目分配,比方說:有10只兔子說了,和他們相同的有3只相同的,那麼咱們能夠4只4只一組,所以,咱們就能夠劃分爲4,4,2,最後一個2個不足4個,不符合條件,因此說明咱們須要再添加2個
      也就是  ⌈(該顏色兔子的總個數)/(兔子一組須要的個數)⌉ *(兔子的組數)
    二、將全部顏色兔子的個數進行相加
代碼思想:
	一、用一個HashMap來存數據(由於它有不重複的特色),
	二、key存放的是說這個顏色有多少隻兔子的個數
	三、value存放的是說這個個數的兔子個數
	四、最後經過一種顏色的兔子個數爲 ⌈value/(key+1)⌉*(key+1)
	五、最後所有相加

三、代碼實現

package com.java;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Day04_Solution {
    public int numRabbits(int[] answers) {
        //map第一個位置和本身顏色相同的兔子的個數,第二個位置是這樣子說的兔子的個數
        Map<Integer,Integer> map = new HashMap<>();
        int sum=0;
        for (int i=0;i<answers.length;i++) {
            if(map.containsKey(answers[i])) {
                map.put(answers[i],map.get(answers[i])+1);
            } else {
                map.put(answers[i],1);
            }
        }
        Set<Integer> keys = map.keySet();
        for (Integer key:keys) {
            Integer value = map.get(key);
            System.out.println(key + ":" + value);
            sum = sum + (int)Math.ceil((double)value / (key + 1)) * (key + 1);
        }

        return sum;
    }
}
相關文章
相關標籤/搜索