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

題目來源於 LeetCode 上第 575 號問題:分糖果。題目難度爲 Easy,目前經過率爲 60.2% 。算法

題目描述

給定一個偶數長度的數組,其中不一樣的數字表明着不一樣種類的糖果,每個數字表明一個糖果。你須要把這些糖果平均分給一個弟弟和一個妹妹。返回妹妹能夠得到的最大糖果的種類數。數組

示例 1:

輸入: candies = [1,1,2,2,3,3] 輸出: 3 解析: 一共有三種種類的糖果,每一種都有兩個。 最優分配方案:妹妹得到[1,2,3],弟弟也得到[1,2,3]。這樣使妹妹得到糖果的種類數最多。bash

示例 2 :

輸入: 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;
    }
}
複製代碼

END

若是你以爲這篇內容對你挺有啓發,那麼你能夠:

一、點贊,讓更多的人也能看到這篇內容(收藏不點贊,都是耍流氓 -_-)

二、關注我,讓咱們成爲長期關係。

三、關注公衆號「五分鐘學算法」,裏面已有 150 多篇與算法有關原創文章。

相關文章
相關標籤/搜索