給定一個偶數長度的陣列,其中不同的數字代表著不同種類的糖果,每一個數字代表一個糖果。你需要把這些糖果平均分給一個弟弟和一個妹妹。返回妹妹可以獲得的最大糖果的種類數。
示例 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 協議》,轉載必須註明作者和本文連結