575.分糖果

题目

原题链接:https://leetcode-cn.com/problems/distribute-candies/

给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果。你需要把这些糖果平均分给一个弟弟和一个妹妹。返回妹妹可以获得的最大糖果的种类数。

示例:

输入: candies = [1,1,2,2,3,3]
输出: 3
解析: 一共有三种种类的糖果,每一种都有两个。最优分配方案:妹妹获得[1,2,3],弟弟也获得[1,2,3]。这样使妹妹获得糖果的种类数最多。

输入: candies = [1,1,2,3]
输出: 2
解析: 妹妹获得糖果[2,3],弟弟获得糖果[1,1],妹妹有两种不同的糖果,弟弟只有一种。这样使得妹妹可以获得的糖果种类数最多。

解题思路

关键是获得糖果种类的数量:

  • 如果糖果种类大于糖果总数的一半糖果需要平均分),返回糖果数量的一半,因为妹妹已经得到种类最多的糖果(得到的都是不同种类的糖果);

  • 如果糖果种类小于糖果总数的一半,则返回糖果的种类(依然是均分的,但妹妹获得的糖果有重复种类)。

代码实现

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;

/**
 * 575.分糖果
 * @date 2021/5/16
 * @author chenzufeng
 */

public class No575_DistributeCandies {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String[] strings = reader.readLine().split(" ");
        int[] candies = new int[strings.length];
        for (int i = 0; i < strings.length; i++) {
            candies[i] = Integer.parseInt(strings[i]);
        }

        System.out.println(distributeCandies(candies));
    }

    static public int distributeCandies(int[] candyType) {
        // HashSet可以去除重复的元素,获得糖果的种类
        HashSet<Integer> hashSet = new HashSet<>();
        for (int candy : candyType) {
            hashSet.add(candy);
        }

        // 如果糖果种类大于糖果数量的一半,则“妹妹获得的最大糖果种类”为糖果数量的一半
        return Math.min(hashSet.size(), candyType.length / 2);
    }
}

复杂度分析

时间复杂度:\(O(n)\)。整个\(candies\)数组只遍历一次。这里,\(n\)表示\(candies\)数组的大小。

空间复杂度:\(O(n)\),在最坏的情况下,\(set\)的大小为\(n\)

posted @ 2021-05-18 23:46  chenzufeng  阅读(86)  评论(0编辑  收藏  举报