題目來源於 LeetCode 上第 575 號問題:分糖果。題目難度爲 Easy,目前經過率爲 60.2% 。算法
給定一個偶數長度的數組,其中不一樣的數字表明着不一樣種類的糖果,每個數字表明一個糖果。你須要把這些糖果平均分給一個弟弟和一個妹妹。返回妹妹能夠得到的最大糖果的種類數。數組
輸入: candies = [1,1,2,2,3,3] 輸出: 3 解析: 一共有三種種類的糖果,每一種都有兩個。 最優分配方案:妹妹得到[1,2,3],弟弟也得到[1,2,3]。這樣使妹妹得到糖果的種類數最多。bash
輸入: candies = [1,1,2,3] 輸出: 2 解析: 妹妹得到糖果[2,3],弟弟得到糖果[1,1],妹妹有兩種不一樣的糖果,弟弟只有一種。這樣使得妹妹能夠得到的糖果種類數最多。 注意:動畫
數組的長度爲[2, 10,000],而且肯定爲偶數。ui
數組中數字的大小在範圍[-100,000, 100,000]內。spa
總共有 n 個糖,平均分給兩我的,每人獲得 n/2 塊糖,那麼能拿到的最大的糖的種類數也就是 n/2 種,不可能更多,只可能更少。code
因此只須要統計出糖的種類數,若是糖的種類數小於 n/2,說明拿不到 n/2種糖,最多能拿到的種類數就是當前糖的總種類數。最後,看(數量的一半)和(全部的種類)哪一個先達到,取二者中較小的值便可。cdn
舉個例子:blog
極端狀況1:全部糖都不重樣,這種狀況妹妹也只能拿到一半的糖果。get
極端狀況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;
}
}
複製代碼
若是你以爲這篇內容對你挺有啓發,那麼你能夠:
一、點贊,讓更多的人也能看到這篇內容(收藏不點贊,都是耍流氓 -_-)
二、關注我,讓咱們成爲長期關係。
三、關注公衆號「五分鐘學算法」,裏面已有 150 多篇與算法有關原創文章。