575. 分糖果

给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果。你需要把这些糖果平均分给一个弟弟和一个妹妹。返回妹妹可以获得的最大糖果的种类数。

示例 1:

输入: candies = [1,1,2,2,3,3]
输出: 3
解析: 一共有三种种类的糖果,每一种都有两个。
最优分配方案:妹妹获得[1,2,3],弟弟也获得[1,2,3]。这样使妹妹获得糖果的种类数最多。
示例 2 :

输入: candies = [1,1,2,3]
输出: 2
解析: 妹妹获得糖果[2,3],弟弟获得糖果[1,1],妹妹有两种不同的糖果,弟弟只有一种。这样使得妹妹可以获得的糖果种类数最多。
注意:

数组的长度为[2, 10,000],并且确定为偶数。
数组中数字的大小在范围[-100,000, 100,000]内。


class Solution {

    /**

     * @param Integer[] $candies

     * @return Integer

     */

    function distributeCandies($candies) {

        if(empty($candies)) return 0;

        $boy = array();

        $count = count($candies);

        //candies value map

        $values = array_count_values($candies);

        arsort($values);

        //弟弟能够拿到的糖果数量

        $xuNumber = $count / 2;

        //最小值

        $min = end($values);

        $sum = 0;

        foreach ($values as $key => &$value) {

            //能力最小的先不承担责任

            if($value == $min) continue;

            //暂时能承担的责任

            $diff = $value - $min;

            $value = $value - $diff;    

            $xuNumber -= $diff;

        }

        if($xuNumber == 0)  return count($values);

        //大家能力都一样了,都来承担,一层一层剥削

        while ( $xuNumber > 0) {

            foreach ($values as $key => &$t) {

                $t = $t - 1;

                if($t == 0) unset($values[$key]);

                $xuNumber = $xuNumber - 1;

                if($xuNumber == 0) break;

            }

        }

        return count($values);    

    }

}
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!