575. 分糖果

zyfsuzy發表於2020-02-09

給定一個偶數長度的陣列,其中不同的數字代表著不同種類的糖果,每一個數字代表一個糖果。你需要把這些糖果平均分給一個弟弟和一個妹妹。返回妹妹可以獲得的最大糖果的種類數。

示例 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 協議》,轉載必須註明作者和本文連結

相關文章