这是悦乐书的第266次更新,第279篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第133题(顺位题号是575)。给定具有偶数长度的整数数组,其中该数组中的不同数字表示不同种类的糖果。 每个数字表示相应种类的一种糖果。 您需要将这些糖果平均分配给哥哥妹妹。 返回妹妹可以获得的最多种类数量的糖果。例如:

输入:糖果= [1,1,2,2,3,3]

输出:3

说明:有三种不同的糖果(1,2和3),每种糖果两种。最佳分配:妹妹有糖果[1,2,3],哥哥也有糖果[1,2,3]。妹妹有三种不同的糖果。

输入:糖果= [1,1,2,3]

输出:2

说明:例如,妹妹有糖果[2,3],哥哥有糖果[1,1]。妹妹有两种不同的糖果,兄弟只有一种糖果。

注意:

  • 给定数组的长度在[2,100]范围内,并且是偶数。

  • 给定数组中的数字在 [-100000, 100000]范围内。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

数组长度是偶数,要将里面的糖果平分给哥哥和妹妹,使得妹妹分到的糖果种类最多。妹妹要想分的糖果种类最多,分为三种情况:

第一,糖果种类和糖果数量的1/2相等,两人分的种类一样多。

第二,糖果种类大于糖果数量的1/2,妹妹得到的糖果种类,最多是糖果数量的1/2.

第三,糖果种类小于糖果数量的1/2,妹妹得到所有的种类。

所以,我们需要知道糖果种类和糖果数量的1/2之间的大小关系,就能直接得出妹妹可以得到的最大糖果种类。使用HashMap,以糖果种类为key,该种类的糖果数量为value,最后比较map的size与数组长度的1/2之间的大小。

public int distributeCandies(int[] candies) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int num : candies) {
map.put(num, map.getOrDefault(num, 0)+1);
}
if (map.size() < candies.length/2) {
return map.size();
}
return candies.length/2;
}

03 第二种解法

其实我们并不需要知道每一个种类的糖果,它的数量有多少,我们只需要有多少种就行。所以,将第一种解法的HashMap替换成HashSet,同样对其size与数组长度的1/2比较大小。

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

04 第三种解法

我们也可以直接遍历数组元素,来获取其中的糖果种类,但是需要先排序,这样才能保证种类记数是有效的。

public int distributeCandies3(int[] candies) {
Arrays.sort(candies);
int count = 1;
for (int i=1; i<candies.length; i++) {
if (candies[i-1] != candies[i]) {
count++;
}
}
if (count < candies.length/2) {
return count;
}
return candies.length/2;
}

05 第四种解法

我们也可以不使用排序,使用一个新的数组,类型选择为布尔类型,此数组初始化时,全部元素值都为false,长度为200001,因为candies的取值范围是[-100000,100000],以candies的元素值加上100000作为新数组的索引,然后将新数组中的元素值改为true,count加1,最后比较count和数组长度的1/2的大小。

public int distributeCandies4(int[] candies) {
boolean[] temp = new boolean[200001];
int count = 0;
for (int num : candies) {
if (!temp[num+100000]) {
count++;
temp[num+100000] = true;
}
}
return count < candies.length/2 ? count : candies.length/2;
}

06 小结

算法专题目前已日更超过四个月,算法题文章133+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Distribute Candies(Java实现)的更多相关文章

  1. LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

  2. LeetCode算法题-Sqrt(Java实现)

    这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...

  3. leetcode算法:Distribute Candies

    Given an integer array with even length, where different numbers in this array represent different k ...

  4. LeetCode算法题-Subdomain Visit Count(Java实现)

    这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...

  5. LeetCode算法题-Number of Lines To Write String(Java实现)

    这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...

  6. LeetCode算法题-Unique Morse Code Words(Java实现)

    这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...

  7. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  8. LeetCode算法题-Rotated Digits(Java实现)

    这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...

  9. LeetCode算法题-Letter Case Permutation(Java实现)

    这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...

随机推荐

  1. BBS论坛(二十三)

    23.添加板块 (1)apps/models class BoardModel(db.Model): __tablename__ = 'board' id = db.Column(db.Integer ...

  2. xtrabackup备份(MySQL备份)与恢复

    xtrabackup备份(MySQL备份)与恢复 1. innobackupex参数选项 --no-timestamp: 不创建一个时间戳 --defaults-file=[MY.CNF] //指定配 ...

  3. hexo配置自己的博客站点

    最近业余时间利用hexo为自己搭建一个高度自定义的个人站点,站点发布在github上,访问地址为:https://cqhaibin.github.io/.本博客简单介绍实现此站点的过程.效果图如下 构 ...

  4. java基础(十六)----- equals()与hashCode()方法详解 —— 面试必问

    本文将详解 equals()与hashCode()方法 概述 java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) publi ...

  5. gradle插件从3.2.0升级到3.2.1后报错Error: Cannot create directory 项目目录\thirdlib\build\intermediates\packaged_res\debug\drawable

    报错信息如下:  解决方案: 删除thirdlib\build目录,然后重新编译. 但是紧接着又会报类似的错误,只不过build目录变成其他module的了. 所以,先clear build,然后再重 ...

  6. Java基础11:Java泛型详解

    本文对java的泛型的概念和使用做了详尽的介绍. 本文参考https://blog.csdn.net/s10461/article/details/53941091 具体代码在我的GitHub中可以找 ...

  7. 使用RESTful风格开发Java Web

    什么是RESTful风格? REST是REpresentational State Transfer的缩写(一般中文翻译为表述性状态转移),REST 是一种体系结构,而 HTTP 是一种包含了 RES ...

  8. [八]JavaIO之FileInputStream 与 FileOutputStream

    接下来介绍 FileInputStream  和 FileOutputStream 现在看名字应该可以看得出来: 他就是从一个文件中读取数据 或者将数据写入到一个文件中 FileInputStream ...

  9. [二十三]JavaIO之PushbackReader

      功能简介   PushBackReader允许将字符推回到流的字符流 reader   PushBackReader 是一个装饰器模式最寻常的样子FilterReader 是抽象的装饰器模式 De ...

  10. 痞子衡嵌入式:史上最强ARM Cortex-M学习资源汇总(持续更新中...)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是ARM Cortex-M学习资源. 类别 资源 版本 短评 官方汇总 cortex-m-resources / ARM公司专家Josep ...