当前位置: 首页 > article >正文

LeetCode题练习与总结:分糖果--575

一、题目描述

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 <= 10^4
  • n 是一个偶数
  • -10^5 <= candyType[i] <= 10^5

二、解题思路

  1. 首先,我们需要计算出所有不同种类的糖的数量。这可以通过使用一个集合(如HashSet)来实现,因为集合会自动去除重复的元素。
  2. 然后,我们需要比较这个不同种类糖的数量和 Alice 可以吃的糖的数量(即 n / 2)。
  3. Alice 可以吃到的最多不同种类的糖的数量将是这两个数中的较小者。

三、具体代码

import java.util.HashSet;
import java.util.Set;

class Solution {
    public int distributeCandies(int[] candyType) {
        // 使用 HashSet 存储不同种类的糖
        Set<Integer> types = new HashSet<>();
        for (int candy : candyType) {
            types.add(candy);
        }
        
        // 计算可以吃到的最多不同种类的糖的数量
        // 取集合大小(不同种类糖的数量)和 n / 2 中的较小值
        return Math.min(types.size(), candyType.length / 2);
    }
}

这段代码首先创建了一个 HashSet 来存储糖果的种类,然后遍历 candyType 数组,将每种糖果的类型添加到集合中。最后,使用 Math.min 方法来获取集合大小(即不同糖果种类的数量)和 n / 2 中的较小值,这就是 Alice 能够吃到的最多不同种类的糖果数量。

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 遍历 candyType 数组:这个操作的时间复杂度是 O(n),其中 n 是数组 candyType 的长度。
  • 将元素添加到 HashSet 中:对于每个元素,添加到集合的操作平均时间复杂度是 O(1)。在最坏的情况下(比如哈希冲突),添加操作的时间复杂度可能会退化,但平均而言,它仍然是 O(1)。

综上所述,总的时间复杂度是 O(n),因为这两个操作是顺序执行的。

2. 空间复杂度
  • HashSet 集合:在最坏的情况下,如果所有的糖果类型都是不同的,集合将包含 n 个元素。因此,空间复杂度是 O(n)。

综上所述,代码的空间复杂度是 O(n),这是由于需要存储不同糖果类型的集合。

五、总结知识点

  • 类定义

    • class 关键字用于定义一个类。
    • 类名 Solution 表示这是一个解决特定问题的类。
  • 方法定义

    • public 关键字表示方法可以被任何其他类访问。
    • int 表示该方法返回一个整数值。
    • 方法名 distributeCandies 表示这个方法用于计算 Alice 可以吃到的最多不同种类的糖的数量。
    • 参数 int[] candyType 表示方法接收一个整数数组作为参数。
  • 数据结构

    • HashSet 是 Java 中的一个集合实现,用于存储唯一元素,即不允许重复。
    • Set 是一个接口,表示一个不包含重复元素的集合。
  • 循环

    • 增强型 for 循环(for-each 循环)用于遍历数组 candyType
  • 集合操作

    • add 方法用于将元素添加到 HashSet 中。
  • 数学计算

    • Math.min 方法用于计算两个数中的较小值。
  • 数组属性

    • length 属性用于获取数组的长度。
  • 类型转换

    • 使用了隐式类型转换,将 candyType.length 除以 2 的结果转换为 int 类型,因为 length 返回的是 int 类型。
  • 方法返回值

    • return 语句用于从方法中返回一个值。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。


http://www.kler.cn/a/517939.html

相关文章:

  • 「 机器人 」扑翼飞行器混合控制策略缺点浅谈
  • 2025_1_26 c++中关于构造和析构的顺序
  • SpringCloud两种注册中心
  • vite环境变量处理
  • RDMA 工作原理 | 支持 RDMA 的网络协议
  • git Bash通过SSH key 登录github的详细步骤
  • 算法刷题Day27:BM65 最长公共子序列(二)
  • SpringCloud两种注册中心
  • 代码随想录刷题day14(2)|(链表篇)02.07. 链表相交(疑点)
  • 《网络安全中的“泛洪”攻击:揭秘、防范与应对策略》
  • TIM编码器接口函数及应用
  • 环境变量配置与问题解决
  • Gin 学习笔记
  • JAVA实战开源项目:在线旅游网站(Vue+SpringBoot) 附源码
  • 【Linux跬步积累】——thread封装
  • 使用Pytest Fixtures来提升TestCase的可读性、高效性
  • Java 实现Excel转HTML、或HTML转Excel
  • 「 机器人 」系统辨识实验浅谈
  • 如何有效进行软件集成测试?常见的集成测试工具分享
  • 工程数学速记手册(下)
  • 汽车免拆诊断案例 | 2007 款日产天籁车起步加速时偶尔抖动
  • 前端react后端java实现提交antd form表单成功即导出压缩包
  • LMI Gocator GO_SDK VS2019引用配置
  • 【2025美赛D题】为更美好的城市绘制路线图建模|建模过程+完整代码论文全解全析
  • ThinkPhp伪静态设置后,访问静态资源也提示找不到Controller
  • 【新人系列】Python 入门(二十九):常用标准库 - 下