这是悦乐书的第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. PHP 扩展管理

    一直对 PHP 扩展了解的似是而非,每次安装扩展都要百度教程,很容易出现各种错误.所幸整理下管理扩展的所有操作,方便日后操作. 查看已加载的扩展 输出 phpinfo(): 使用 get_loaded ...

  2. 【JMeter】(3)---MySQL压测

    JMeter---MySQL压测 一.添加MySQL驱动jar包 在测试计划(Test Plan)页面添加jar包 二.添加MySQL连接配置 添加线程组右击-->添加(add)-->配置 ...

  3. Kafka分区与消费者的关系

    1.  前言 我们知道,生产者发送消息到主题,消费者订阅主题(以消费者组的名义订阅),而主题下是分区,消息是存储在分区中的,所以事实上生产者发送消息到分区,消费者则从分区读取消息,那么,这里问题来了, ...

  4. 有道云笔记 - Markdown模板(文首附markdown源码,即.md文件)

    有道云笔记 - Markdown模板 附 本文的Markdown源码镜像: https://github.com/yanglr/AlgoSolutions/blob/master/Youdao_Not ...

  5. Eclipse导入别人的项目报错:Unable to load annotation processor factory 'xxxxx.jar' for project

    使用eclipse导入别人的项目时候,报错Unable to load annotation processor factory 'xxxxx.jar' for project. 解决方案 1.项目右 ...

  6. SQL数据库连接语句

    一般的远程访问的写成这样: Data Source=IP ;Initial Catalog=数据库名 ;UserID= 用户名 ;Password=密码 本地访问的写成这样: Data Source= ...

  7. 如何发起、防御和测试XSS攻击,我们用DVWA来学习(下)

    上一篇我们了解了XSS攻击的原理,并且利用DVWA尝试了简单的XSS攻击,这一篇我们来实现更复杂的攻击,然后探讨防御机制和测试理念. 前面我们通过脚本注入让网页弹出了用户cookie信息,可以光弹窗是 ...

  8. Linux基础知识第四讲,文件内容命令

    目录 一丶常用命令 1.cat命令演示以及常用选项 2.grep 搜索命令的使用 3.echo 以及 重定向的使用 4.管道概念 一丶常用命令 序号 命令 对应英文 作用 01 cat 文件名 con ...

  9. Docker系列08—搭建使用私有docker registry

    本文收录在容器技术学习系列文章总目录 1.了解Docker Registry 1.1 介绍 registry 用于保存docker 镜像,包括镜像的层次结构和元数据. 启动容器时,docker dae ...

  10. 【MongoDB】使用MongoVUE看不到插入的数据

    问题描述 明明在命令行中,输入mongodb的插入数据的命令,并且插入数据显示成功,却在MongoVUE可视化工具中,看不到插入的数据? mongodb使用版本为(3.4.6) mongoVUE使用版 ...