三分鐘看完「分糖果」演算法問題

程式設計師吳師兄發表於2019-05-13

題目來源於 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 多篇與演算法有關原創文章。

相關文章