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 排序后查找(费时间省空间)

#include <stdlib.h>
#include <stdio.h>
int cmp(const int *a, const int *b)
{
    return (*(int*)a - *(int*)b);
}

int distributeCandies(int* candyType, int candyTypeSize) {
    int res = 0;
    int lastEatType = -1;
    qsort(candyType,candyTypeSize,sizeof(int),cmp);
    for (int i = 0; i < candyTypeSize; i++)
    {
        if(candyType[i] != lastEatType)
        {
            lastEatType = candyType[i];
            res++;
        }
        if(res >= candyTypeSize / 2)
        {
            break;
        }
    }
    return res;
}

int main(void)
{
    int a[]= {10000,0,10000,0,10000,0,10000,0,10000,0,10000,0};
    int size = sizeof(a) / sizeof(a[0]);
    int ret = distributeCandies(a, size);
    printf("ret = %d\n",ret);
}

代码复杂度分析

  1. 时间复杂度:

    • 主要的计算成本来自 qsort 函数,该函数对 candyType 数组进行排序。qsort 的平均时间复杂度是 (O(nlog n)),其中 (n) 是 candyTypeSize
    • 排序之后,代码遍历排序后的数组一次。这个循环的时间复杂度是 (O(n))
    • 因此,函数的总体时间复杂度主要由排序步骤决定,为(O(nlog n))
  2. 空间复杂度:

    • 空间复杂度主要由 qsort 函数决定,通常需要(O(log n)) 的额外空间用于递归栈。
    • 除此之外,只使用了几个整数 (res, lastEatType, 循环索引 i),这些是(O(1))
    • 因此,整体空间复杂度是(O(log n))

代码拆解

以下是代码的逐步拆解:

  1. 比较函数:

    int cmp(const int *a, const int *b)
    {
        return (*(int*)a - *(int*)b);
    }
    
    • 这是一个比较函数,用于 qsort。它接收两个整数指针作为参数,返回它们的差值,用于决定排序顺序。
  2. 分发糖果函数:

    int distributeCandies(int* candyType, int candyTypeSize) {
        int res = 0;
        int lastEatType = -1;
        qsort(candyType, candyTypeSize, sizeof(int), cmp);
    
    • distributeCandies 函数接收一个整数数组 candyType 和数组的大小 candyTypeSize
    • 初始化结果 res 为 0 和 lastEatType 为 -1。
    • 使用 qsortcandyType 数组进行排序。
  3. 遍历排序后的数组:

        for (int i = 0; i < candyTypeSize; i++)
        {
            if(candyType[i] != lastEatType)
            {
                lastEatType = candyType[i];
                res++;
            }
            if(res >= candyTypeSize / 2)
            {
                break;
            }
        }
        return res;
    }
    
    • 遍历排序后的数组:
      • 如果当前糖果类型与上一个吃过的糖果类型不同,则更新 lastEatType 为当前糖果类型,并将 res 加1。
      • 如果 res 达到或超过糖果总数的一半,则跳出循环。
    • 返回 res,即可以分发的不同糖果类型的数量。

结果

代码1结果

解法2 用数组下标查找(费空间省时间)

int distributeCandies(int* candyType, int candyTypeSize) {
    int res = 0;
    int typeArr[200000] = {0}; // type从-10000 到10000
    for (int i = 0; i < candyTypeSize; i++)
    {
        if(typeArr[candyType[i]+100000 - 1] == 0) // -1防止越界
        {
            typeArr[candyType[i]+100000 - 1] = 1;
            res ++;
        }
        if(res >= candyTypeSize / 2)
        {
            break;
        }
    }
    
    return res;
}

代码复杂度分析

  1. 时间复杂度:

    • 代码遍历数组一次。循环的时间复杂度是 (O(n))
  2. 空间复杂度:

    • 空间复杂度来自于typeArr数组,题目规定范围是-10^5 ~ 10^ 5,因此也可以看作(O(1)),其他的变量都是 (O(1))
    • 因此对于这一题,这个复杂度也是(O(1))

结果

不出所料地比第一种解法优
结果

总结

  • 该函数通过排序和遍历来计算可以分发的最大不同糖果类型数量。
  • 关键步骤是使用 qsort 进行排序,然后遍历已排序数组,确保每种糖果类型只计数一次,直到达到最大可分发数量。
  • 如果对题目分析透彻一点,投机取巧可以省下时间和空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/670768.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW版本控制

LabVIEW作为一种流行的图形化编程环境&#xff0c;在软件开发中广泛应用。有效地管理版本控制对于确保软件的可靠性和可维护性至关重要。LabVIEW提供了多种方式来管理VI和应用程序的修订历史&#xff0c;以满足不同规模和复杂度的项目需求。 LabVIEW中的VI修订历史 LabVIEW内置…

低代码选型要注意什么问题?

低代码选型时&#xff0c;确实需要从多个角度综合考虑&#xff0c;以下是根据您给出的角度进行的分析和建议&#xff1a; 公司的人才资源&#xff1a; 评估团队中是否有具备编程能力的开发人员&#xff0c;以确保能够充分利用低代码平台的高级功能和进行必要的定制开发。考察实…

11.2.0.3RAC 备份集恢复为单实例11.2.0.4_法一:rman备份恢复

关键步骤&#xff1a; 1、移动硬盘格式化成Linux可以识别的文件系统&#xff0c;mount到备份目录&#xff0c;开始rman备份&#xff0c;备份完成后&#xff0c;插到目标服务器挂载&#xff0c; 2、恢复参数文件nomount库&#xff0c;恢复控制文件mount库&#xff0c;restore …

工业互联网数字中台建设方案(ppt)

工业互联网数字中台整体解决方案&#xff08;ppt原件&#xff09; 1、工业数字中台的价值 2、数字化中台的特点 3、数字化中台方案介绍 软件项目相关全套精华资料包获取方式①&#xff1a;点我获取 获取方式②&#xff1a;本文末个人名片直接获取。 软件资料清单列表部分文档…

pyopengl 立方体 正投影,透视投影

目录 顶点和线的方式 划线的方式实现: 顶点和线的方式 import numpy as np from PyQt5 import QtWidgets from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton from OpenGL.GL import * from OpenGL.GLU import * import sys…

Jupyter Notebook快速搭建

Jupyter Notebook why Jupyter Notebook Jupyter Notebook 是一个开源的 Web 应用程序&#xff0c;允许你创建和分享包含实时代码、方程、可视化和解释性文本的文档。其应用包括&#xff1a;数据清洗和转换、数值模拟、统计建模、数据可视化、机器学习等等。 Jupyter Notebo…

springboot+vue+mybatis超市管理-简单版+PPT+论文+讲解+售后

使用旧方法对超市信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在超市信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的小型超市管理系统有管理员&…

深度学习-04-数值的微分

深度学习-04-数值的微分 本文是《深度学习入门2-自製框架》 的学习笔记&#xff0c;记录自己学习心得&#xff0c;以及对重点知识的理解。如果内容对你有帮助&#xff0c;请支持正版&#xff0c;去购买正版书籍&#xff0c;支持正版书籍不仅是尊重作者的辛勤劳动&#xff0c;也…

vulhub中Jenkins CLI 接口任意文件读取漏洞复现(CVE-2024-23897)

Jenkins是一个开源的自动化服务器。 Jenkins使用[args4j](https://github.com/kohsuke/args4j)来解析命令行输入&#xff0c;并支持通过HTTP、Websocket等协议远程传入命令行参数。args4j中用户可以通过字符来加载任意文件&#xff0c;这导致攻击者可以通过该特性来读取服务器…

童趣盎然,米香四溢 —— 蒙自源六一儿童节特别献礼

充满欢声笑语的六一儿童节马上就要来了&#xff0c;在这个充满童真和喜悦的时刻&#xff0c;蒙自源米线品牌以一颗童心&#xff0c;为所有大朋友和小朋友准备了一份特别的礼物。 从5月25日开始&#xff0c;蒙自源诚挚邀请您和孩子们一同前往蒙自源旗下各大门店&#xff0c;品尝…

Minio启动脚本-Windows版

MinIO 是一种高性能、S3 兼容的对象存储。 它专为大规模 AI/ML、数据湖和数据库工作负载而构建,并且它是由软件定义的存储。 不需要购买任何专有硬件,就可以在云上和普通硬件上拥有分布式对象存储。 MinIO拥有开源 GNU AGPL v3 和商业企业许可证的双重许可。 ——摘自…

集合类源码浅析のArrayList

源码分析路线图&#xff1a; 初级部分&#xff1a;ArrayList->LinkedList->Vector->HashMap(红黑树数据结构&#xff0c;如何翻转&#xff0c;变色&#xff0c;手写红黑树)->ConcurrentHashMap 中级部分&#xff1a;Spring->Spring MVC->Spring Boot->M…

一文彻底讲透 PyTorch

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 汇总合集…

linux系统的vscode快捷键大全

多行注释快捷键&#xff1a;ctrl shift A 单行注释&#xff1a;ctrl K ctrl C 取消单行注释&#xff1a;ctrl K ctrl U

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:轨道交通监控系统

株洲中车时代电气股份有限公司&#xff08;下称中车时代电气&#xff09;是中国中车旗下股份制企业&#xff0c;其前身及母公司——中车株洲电力机车研究所有限公司创立于1959年。中车时代电气扎根株洲&#xff0c;走好两条钢轨&#xff0c;走出两条钢轨。中车时代电气秉承“双…

抽象一个通用的配置冲突解决方案

最近的开发项目中遇到了一个关于配置冲突的解决和产品设计&#xff0c;一直以来都没有处理好。最近抽空整理了一下思路和设计&#xff0c;并做了抽象&#xff0c;后续的类似使用&#xff0c;可以做到直接复用。 思路和代码见&#xff1a;github地址&#xff1a;https://github…

RTA GMH系列 SERIE MOTION电机驱动板手侧 英文版

RTA GMH系列 SERIE MOTION电机驱动板手侧 英文版

ESP-01S 使用 arduino 烧录程序

一、设置 arduino 编辑器 1、文件-首选项-附加开发版管理网址中添加 http://arduino.esp8266.com/stable/package_esp8266com_index.json 2、工具-开发板管理 搜索 8266 并下载 ) 3、工具-开发板 在 8266 里面选择 Generic ESP8266 Module 4、工具-端口 记得选择对应的端口 …

Pytorch的学习

1.基本数据&#xff1a;Tensor Tensor&#xff0c;即张量&#xff0c;是PyTorch中的基本操作对象&#xff0c;可以看做是包含单一数据类型元素的多维矩阵。从使用角度来看&#xff0c;Tensor与NumPy的ndarrays非常类似&#xff0c;相互之间也可以自由转换&#xff0c;只不过Te…

简单的基于小波分解和独立分量分析的脑电信号降噪(Python)

脑电信号是一种典型的非平稳随机信号且存在一定的非高斯性和非线性。传统的分析处理方法是将脑电信号近似看做线性、准平稳、高斯分布的随机信号&#xff0c;这使得分析结果往往不能令人满意&#xff0c;实用性较差。现代的小波变换方法和独立分量分析方法的提出为有效地分析脑…