題目來源於 LeetCode 上第 575 號問題:分糖果。題目難度為 Easy,目前通過率為 60.2% 。
題目描述
給定一個偶數長度的陣列,其中不同的數字代表著不同種類的糖果,每一個數字代表一個糖果。你需要把這些糖果平均分給一個弟弟和一個妹妹。返回妹妹可以獲得的最大糖果的種類數。
示例 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]內。
題目解析
總共有 n 個糖,平均分給兩個人,每人得到 n/2 塊糖,那麼能拿到的最大的糖的種類數也就是 n/2 種,不可能更多,只可能更少。
所以只需要統計出糖的種類數,如果糖的種類數小於 n/2,說明拿不到 n/2種糖,最多能拿到的種類數就是當前糖的總種類數。最後,看(數量的一半)和(所有的種類)哪個先達到,取兩者中較小的值即可。
舉個例子:
極端情況1:所有糖都不重樣,這種情況妹妹也只能拿到一半的糖果。
極端情況2:只有一種糖,這種情況妹妹只能得到一種糖果。
平均情況:每個糖都有兩個,這種情況妹妹可以拿到所有種類,數量與 極端情況1 一樣。
求糖果的種類數使用 hash 即可。
動畫描述
程式碼實現
class Solution {
public int distributeCandies(int[] candies) {
Set<Integer> nums = new HashSet<>();
for (int i = 0; i < candies.length; i++) {
nums.add(candies[i]);
}
int numNums = nums.size();
int numTarget = candies.length / 2;
return numNums >= numTarget ? numTarget : numNums;
}
}
複製程式碼
END
如果你覺得這篇內容對你挺有啟發,那麼你可以:
1、點贊,讓更多的人也能看到這篇內容(收藏不點贊,都是耍流氓 -_-)
2、關注我,讓我們成為長期關係。
3、關注公眾號「五分鐘學演算法」,裡面已有 150 多篇與演算法有關原創文章。