力扣575(java&python)-分糖果(简单)
题目:
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)-分糖果(简单)的更多相关文章
- 力扣——candy (分糖果) python实现
题目描述: 中文: 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. ...
- Java实现 LeetCode 575 分糖果(看看是你的长度小还是我的种类少)
575. 分糖果 给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果.你需要把这些糖果平均分给一个弟弟和一个妹妹.返回妹妹可以获得的最大糖果的种类数. 示例 1: 输入 ...
- LeetCode(力扣)——Search in Rotated Sorted Array2 搜索旋转排序数组 python实现
题目描述: python实现 Search in Rotated Sorted Array2 搜索旋转排序数组 中文: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0 ...
- LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现
题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组 中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...
- 力扣485. 最大连续1的个数-C语言实现-简单题
题目 [题目传送门] 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3 ...
- 力扣561. 数组拆分 I-C语言实现-简单题
题目 传送门 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(a ...
- 力扣566. 重塑矩阵-C语言实现-简单题
题目 传送门 在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据. 给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要 ...
- 力扣832. 翻转图像-C语言实现-简单题
题目 传送门 文本 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果. 水平翻转图片就是将图片的每一行都进行翻转,即逆序.例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, ...
- 力扣算法经典第一题——两数之和(Java两种方式实现)
一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...
- 力扣—Reorder List(重排链表)python实现
题目描述: 中文: 给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点 ...
随机推荐
- ubuntu添加桌面快捷打开方式
不太喜欢ubuntu开机后空荡荡的桌面,希望可以有些像windows一样的快捷打开方式.看了一些博客,也自己探索了一下,发现了在ubuntu中添加软件自带的桌面快捷打开方式的方法. 在终端 cd /u ...
- 【stras-one】星念漫画下载器
原文链接:[stras-one]星念漫画下载器 - Stars-One的杂货小窝 一款将在线漫画保存到本地的下载工具 应一位蓝奏云批量下载器的用户的要求,实现了这款漫画下载的工具开发, 一直没时间,鸽 ...
- 【福利】JetBrains 全家桶永久免费使用
Jetbrains系列的IDE公认是最好的集成开发工具,但是收费且挺贵.我们以PhpStorm为例,新用户第一年需要199$,注意是$,还不是人民币,这个价格一上来肯定筛选掉一大批用户.确实好用,所以 ...
- rust结构体包含另一个结构体引用时,serde序列化问题
代码如下 use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize)] struct Person { id: Stri ...
- KingabseES kingbase_fdw 跨库关联查询
背景 我们在做综合应用项目的时候,通常会面临客户的每个应用系统使用各自的数据库,或者存放在不同的服务器.查询报表可能使用多个应用数据,这样就需要跨库读取数据表或视图. KINGBASE_FDW 是一种 ...
- 高德地图和echarts结合实现地图下钻(二)
一.学习ajax发送异步请求 1 $(function(){ 2 //请求参数 3 var list = {}; 4 // 5 $.ajax({ 6 //请求方式 7 type : "POS ...
- Spring框架之控制反转IoC(Inversion of Control)的理解
简单理解: 控制反转就是将代码的调用权(控制权)从调用方转移给被调用方(服务提供方). 解释一下: 如果我们需要创建某个类,就需要程序员去修改代码,然后才可以得到想要的类.反转的意思就是不需要程序员去 ...
- #Splay#洛谷 1486 [NOI2004]郁闷的出纳员
题目 分析 考虑加减工资直接打标记,查询第\(k\)多可以用平衡树, 删除有点恶心,这里考虑Splay,将需要删除的部分的后继splay到根节点并将左子树断边 代码 #include <cstd ...
- OpenHarmony Liteos_A内核之iperf3移植心得
一.iperf3工作原理 iperf3主要的功能是测试基于特定路径的带宽,在客户端和服务器端建立连接(三次握手)后,客户端发送一定大小的数据报并记下发送的时间,或者客户端在一定的时间内发送数据并记下发 ...
- 国产化改造就用 Java Solon,v2.7.3 发布
Java Solon 是什么框架? 是一个可平替 Spring 生态的 Java 应用开发框架.从零开始构建(非 java-ee 架构),有自己的标准规范与开放生态.(历时七年,具备全球第二级别的生态 ...