题目:

Alice 有 n 枚糖,其中第 i 枚糖的类型为 candyType[i] 。Alice 注意到她的体重正在增长,所以前去拜访了一位医生。

医生建议 Alice 要少摄入糖分,只吃掉她所有糖的 n / 2 即可(n 是一个偶数)。Alice 非常喜欢这些糖,她想要在遵循医生建议的情况下,尽可能吃到最多不同种类的糖。

给你一个长度为 n 的整数数组 candyType ,返回: Alice 在仅吃掉 n / 2 枚糖的情况下,可以吃到糖的 最多 种类数。

示例 1:

输入:candyType = [1,1,2,2,3,3]
输出:3
解释:Alice 只能吃 6 / 2 = 3 枚糖,由于只有 3 种糖,她可以每种吃一枚。
示例 2:

输入:candyType = [1,1,2,3]
输出:2
解释:Alice 只能吃 4 / 2 = 2 枚糖,不管她选择吃的种类是 [1,2]、[1,3] 还是 [2,3],她只能吃到两种不同类的糖。
示例 3:

输入:candyType = [6,6,6,6]
输出:1
解释:Alice 只能吃 4 / 2 = 2 枚糖,尽管她能吃 2 枚,但只能吃到 1 种糖。

提示:

n == candyType.length
2 <= n <= 104
n 是一个偶数
-105 <= candyType[i] <= 105

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/distribute-candies
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

今天是完全不看题解,能直接写出来的简单题第3道。

一、模拟

我观察了一下示例,数组candyType的长度就为糖果的总数,于是先求出糖果的总数,再算出Alice能吃多少枚糖nums,因为有重复种类的糖果,就用set的去重特征把重复的糖果种类去掉,最终set集合中存在的是唯一的糖果种类

  • 如果nums >= set.size():说明能吃的数量大于糖果种类,但是种类只有额定数量,故最多也只能吃set.size();
  • 如果nums < set.size():说明能吃的糖果数量小于糖果种类数,但是只能吃nums种。

java代码:

 1 class Solution {
2 public int distributeCandies(int[] candyType) {
3 int n = candyType.length;
4 int nums = n / 2;
5 HashSet<Integer> set = new HashSet<>();
6 for(int i = 0; i < n; i++){
7 set.add(candyType[i]);
8 }
9 if(nums >= set.size()){
10 return set.size();
11 }else{
12 return nums;
13 }
14 }
15 }

python3一行代码:

1 class Solution:
2 def distributeCandies(self, candyType: List[int]) -> int:
3 return min(len(set(candyType)), len(candyType) // 2)

二、贪心法

思路跟上面的模拟差不多,写得具体一点

由于题目规定糖果数量 n为偶数,因此一定能将糖果平均分配成两份,能吃到的糖只有一半:n /2 ,假设糖果种类数量为 m,进行分情况讨论:

  • 如果 m < n/2,那么,可以分得的糖果种类最多为 m 种,即每种糖果至少一颗。
  • 如果 m > n/2,那么,可以分得的糖果种类为 n/2 种,即每种种类最多一颗。
  • 如果 m = n/2,那么,每种正好分配一颗,即可得 m 种。

综上,最终可分得的糖果种类为 min(m, n/2)​

参考:@【彤哥来刷题啦】优化代码:https://leetcode.cn/problems/distribute-candies/solution/tong-ge-lai-shua-ti-la-yi-ti-liang-jie-t-74pf/

根据题目给定的数据范围为 [-100,000, 100,000],比较小,所以,我们可以声明一个数组来模拟哈希表快速统计种类,并且,当种类的数量大于总数的一半时,就停止遍历了。

java代码:

 1 class Solution {
2 public int distributeCandies(int[] candyType) {
3 //建立一个hash数组对candyType进行去重
4 boolean[] hash = new boolean[200001];
5 //用count来对candyType中不重复的数字即糖果种类进行计数
6 int count = 0;
7 for(int candy : candyType){
8 //candy + 100001 保证了 hash数组下标从0开始
9 //如果candy不重复,放入hash数组中
10 if(!hash[candy + 100000]){
11 count++;
12 hash[candy + 100000] = true;
13 //如果种类数已经大于等于糖果的一半,就不用再继续遍历了
14 if(count >= candyType.length / 2) break;
15 }
16 }
17 return count;
18 }
19 }

力扣575(java&python)-分糖果(简单)的更多相关文章

  1. 力扣——candy (分糖果) python实现

    题目描述: 中文: 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. ...

  2. Java实现 LeetCode 575 分糖果(看看是你的长度小还是我的种类少)

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

  3. LeetCode(力扣)——Search in Rotated Sorted Array2 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array2 搜索旋转排序数组   中文: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0 ...

  4. LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组   中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...

  5. 力扣485. 最大连续1的个数-C语言实现-简单题

    题目 [题目传送门] 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3 ...

  6. 力扣561. 数组拆分 I-C语言实现-简单题

    题目 传送门 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(a ...

  7. 力扣566. 重塑矩阵-C语言实现-简单题

    题目 传送门 在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据. 给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要 ...

  8. 力扣832. 翻转图像-C语言实现-简单题

    题目 传送门 文本 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果. 水平翻转图片就是将图片的每一行都进行翻转,即逆序.例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, ...

  9. 力扣算法经典第一题——两数之和(Java两种方式实现)

    一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...

  10. 力扣—Reorder List(重排链表)python实现

    题目描述: 中文: 给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点 ...

随机推荐

  1. python文件获取并读取固定长度数据实例解析

    一 概念 1 file 操作: 文件操作一般有open,write,read,close几种,这里重点是read固定长度数据. read() 用于从文件读取指定的字节数,如果未给定或为负则读取所有. ...

  2. day02-显示所有菜品&点餐功能

    满汉楼02 4.功能实现04 4.6显示所有菜品 4.6.1思路分析 创建一个菜单表menu,在Domain层创建与菜单表对应的Javabean-Menu类,在DAO层创建MenuDAO,完成对men ...

  3. 杂谈之WEB前端工程师身价

    了解javascript语言规范么?+1000 知道各浏览器的css差异么?+1000 javascript差异呢?+1000 知道html各标签的含义并很好地运用么?+1000 知道如何跨浏览器解决 ...

  4. drf(视图组件)

    一. 前言 Django REST framwork 提供的视图的主要作用 1. 控制序列化器的执行(检验.保存.转换数据) 2. 控制数据库查询的执行 二. 两个视图基类 两个视图基类: APIVi ...

  5. .Net依赖注入神器Scrutor(上)

    前言 从.Net Core 开始,.Net 平台内置了一个轻量,易用的 IOC 的框架,供我们在应用程序中使用,社区内还有很多强大的第三方的依赖注入框架如: Autofac DryIOC Grace ...

  6. WebStorm 没有找到本地修改记录LocalChanges,怎么查看本地修改记录

    一直用IDEA做后端Java开发,也写过vue+elementUI的前端代码,但前后端都放在一个项目里写,本地修改代码记录,可以在git-LocalChanges中查看修改记录. 最近前后端分离,自己 ...

  7. 虚拟DOM的理解与总结

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1. 对虚拟DOM的理解? 从本质上来说,Virtual Dom是一个JavaScript对象,通过对象的方式来表示DOM结构.将页面的状 ...

  8. 【虚幻引擎】DTWebSocketServer 蓝图创建WebSocket服务器插件使用说明

    本插件可以使用蓝图创建WebSocket服务器,并监听响应数据. 下载地址在文章最后. 1. 节点说明 Create Web Socket Server – 创建WebSocket服务器对象并开启监听 ...

  9. Postman模拟向Eureka注册服务

    1.官方地址:https://github.com/Netflix/eureka/wiki/Eureka-REST-operations 2.自己搭建一个 Eureka服务运行起来. 3.打开Post ...

  10. SSH和SFTP是否相同

    SSH和SFTP是否相同?SSH和SFTP是经典的对.在确保通信安全方面,它们交织在一起,尽管它们具有类似的功能,但它们并不是一回事.那么,它们之间有什么区别?请仔细阅读,找出答案. 什么是SSH? ...