博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分糖果 Distribute Candies
阅读量:6222 次
发布时间:2019-06-21

本文共 2773 字,大约阅读时间需要 9 分钟。

  hot3.png

问题:

Given an integer array with even length, where different numbers in this array represent different kinds of candies. Each number means one candy of the corresponding kind. You need to distribute these candies equally in number to brother and sister. Return the maximum number of kinds of candies the sister could gain.

Example 1:

Input: candies = [1,1,2,2,3,3]Output: 3Explanation:There are three different kinds of candies (1, 2 and 3), and two candies for each kind.Optimal distribution: The sister has candies [1,2,3] and the brother has candies [1,2,3], too. The sister has three different kinds of candies.

Example 2:

Input: candies = [1,1,2,3]Output: 2Explanation: For example, the sister has candies [2,3] and the brother has candies [1,1]. The sister has two different kinds of candies, the brother has only one kind of candies.

Note:

  1. The length of the given array is in range [2, 10,000], and will be even.
  2. The number in given array is in range [-100,000, 100,000].

解决: 

①使用HashMap对糖果进行分类,若糖果种类大于数组的一半,则sister最多得数组的一半的种类,否则,得到map中的分类数。耗时157ms。

public class Solution {

    public int distributeCandies(int[] candies) {//妹妹最多能得多少中糖果
        Map<Integer,Integer> map = new HashMap<>();
        int n = candies.length;
        for (int i = 0;i < candies.length ;i ++ ) {
            map.put(candies[i],map.getOrDefault(candies[i],0) + 1);
        }
        if(map.size() > n / 2){//若糖果的种类大于数组的一半,最多得一半
            return n / 2;
        }else{//否则,返回糖果的种类即可
            return map.size();
        }
    }
}

②使用了自己写的hash表来对糖果进行分类。耗时95ms。

public class Solution {

    public int distributeCandies(int[] candies) {//妹妹最多能得多少中糖果
        int[] hash = new int[200001];//用于存储种类
        for (int i = 0;i < candies.length ;i ++ ) {
            hash[candies[i] + 100000] ++;
        }
        int count = 0;
        for (int arr:hash) {
            if(arr != 0){
                count ++;
            }
        }
        if (count > candies.length / 2) {
            return candies.length / 2;
        }else{
            return count;
        }
    }
}

public class Solution {

    public int distributeCandies(int[] candies) {//这样处理性能会好一些
        byte[] hash = new byte[200001];       
        int count = 0; 
        int l = candies.length / 2;
        for (int i = 0; i < candies.length; i++) {
            if (hash[candies[i] + 100000] == 0) {
                hash[candies[i] + 100000] = 1;
                count ++;
            } 
            if (count >= candies.length / 2){
                return candies.length / 2;
            }
        }
        return count;
    }
}

③使用HashSet存储每一种类。耗时123ms。

public class Solution {

    public int distributeCandies(int[] candies) {
        Set<Integer> set = new HashSet<>();
        for (int c : candies) {
            set.add(c);
        }
        return set.size() > candies.length / 2 ? candies.length / 2 : set.size(); 
    }
}

④也可以将数组先排序,然后进行遍历种类。耗时105ms。

public class Solution {

    public int distributeCandies(int[] candies) {//这样处理性能会好一些
        Arrays.sort(candies);
        int count = 1;
        for (int i = 1;i < candies.length;i ++) {
            if (candies[i] != candies[i - 1]) {
                count ++;
            }
            if (count > candies.length / 2) {
                return candies.length / 2;
            }
        }
        return count;
    }
}

转载于:https://my.oschina.net/liyurong/blog/915832

你可能感兴趣的文章
Serializable java序列化
查看>>
SQL PLUS远程连接
查看>>
SharePoint 2013 InfoPath 无法保存下列表单
查看>>
Ini操作类
查看>>
python登陆Tom邮箱的代码一例
查看>>
[实变函数]4.3 可测函数的构造
查看>>
sdut 2158:Hello World!(第一届山东省省赛原题,水题,穷举)
查看>>
[转]最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等本文出处...
查看>>
AndroidUI 控件命名格式
查看>>
数据库系统基本概念
查看>>
tcpCopy
查看>>
10个小众网
查看>>
2000条你应知的WPF小姿势 基础篇<15-21>
查看>>
iOS SDK 从配置文件里读SDK。转化成class 可同时加载多个SDK
查看>>
解决Qt Creator编译输出窗口乱码的问题
查看>>
C#获取当前时区转换方法
查看>>
卡片式电脑介绍
查看>>
经济学发展简史
查看>>
PMP考试的过与只是
查看>>
[家里蹲大学数学杂志]第248期东北师范大学2013年数学分析考研试题
查看>>