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

力扣100097. 合法分组的最少组数(哈希+贪心)

题目描述:

给你一个长度为 n 下标从 0 开始的整数数组 nums 。

我们想将下标进行分组,使得 [0, n - 1] 内所有下标 i 都 恰好 被分到其中一组。

如果以下条件成立,我们说这个分组方案是合法的:

  • 对于每个组 g ,同一组内所有下标在 nums 中对应的数值都相等。
  • 对于任意两个组 g1 和 g2 ,两个组中 下标数量 的 差值不超过 1 。

请你返回一个整数,表示得到一个合法分组方案的 最少 组数。

示例 1:

输入:nums = [3,2,3,2,3]
输出:2
解释:一个得到 2 个分组的方案如下,中括号内的数字都是下标:
组 1 -> [0,2,4]
组 2 -> [1,3]
所有下标都只属于一个组。
组 1 中,nums[0] == nums[2] == nums[4] ,所有下标对应的数值都相等。
组 2 中,nums[1] == nums[3] ,所有下标对应的数值都相等。
组 1 中下标数目为 3 ,组 2 中下标数目为 2 。
两者之差不超过 1 。
无法得到一个小于 2 组的答案,因为如果只有 1 组,组内所有下标对应的数值都要相等。
所以答案为 2 。

示例 2:

输入:nums = [10,10,10,3,1,1]
输出:4
解释:一个得到 2 个分组的方案如下,中括号内的数字都是下标:
组 1 -> [0]
组 2 -> [1,2]
组 3 -> [3]
组 4 -> [4,5]
分组方案满足题目要求的两个条件。
无法得到一个小于 4 组的答案。
所以答案为 4 。

提示:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 109

思路:

题目要求我们求出最小的分组数目,首先我们可以确定的是,一个数组一定有答案,因为再不济把他每个元素都分一个组就可以了,又由于对于任意两个组 g1 和 g2 ,两个组中 下标数量 的 差值不超过1,假设我们分的所有的组的下标数量最小为k,那么最大也只能是k+1.

我们可以先用一个map存下每一个数出现的次数,对于每一个数it,出现的次数为cnt,我们看能否将这cnt个it分为只包含k个和k+1个的组。

假设数组中出现的最小次数的数目为mi,那么很容易得到k<=mi.如果k>mi,意味着至少有一组凑不够k个相同的数(同一组内所有下标在 nums 中对应的数值),所以我们可以遍历k(分的所有的组的下标数量最小值),k确定了,k+1也就确定了。

对于每一个k,我们看nums里的所有数出现的次数能不能分为只包含k个和k+1个的组。

如果可以,我们就把当前k可以分得的最小组的数目求一个最小值ans.

如果不能那就。。。那就不能。

时间复杂读为什么是O(n)?

假设t表示的是nums数组中不同元素的个数,那么最小出现次数mi<=n/t,所以mi*t<=n.

O(min(mp[nums[i])*t)=O(mi*t)=O(n/t *t)=O(n)

这里计算时间复杂度非常重要哦,我开始也是算错了时间复杂度以为是o(n^2)了。、

代码:

class Solution {
public:int minGroupsForValidAssignment(vector<int>& nums) {map<int,int> mp;int len=nums.size();int mi=1e9+10;//最少出现次数for(auto it:nums){mp[it]++;//记录每个元素出现的次数}for(auto it:mp){mi=min(it.second,mi);}int ans=1e9;for(int k=1;k<=mi;k++){int tn=0;//记录当前k可以分得到的最小数目的组数int f=1;for(auto it:mp){int cnt=it.second;int a = cnt / (k + 1);int b = cnt - a * (k + 1);if (cnt % (k + 1) == 0) {//尽量拼元素多的组tn += a;}else if (a + b >= k){//看能不能在a个(k+1)的组里面分诺干个1到剩下的b里面tn += a + 1;}else{//优先拼k+1组失败了,退而求其次优先考虑拼k组int a = cnt / (k );int b = cnt - a * (k);if(b>a){//如果剩下的元素b不能分到a个(k)组里面,说明分组失败f=0;break;}tn+=a;}}if(f) ans=min(ans,tn);}return ans;}
};

相关文章:

力扣100097. 合法分组的最少组数(哈希+贪心)

题目描述&#xff1a; 给你一个长度为 n 下标从 0 开始的整数数组 nums 。 我们想将下标进行分组&#xff0c;使得 [0, n - 1] 内所有下标 i 都 恰好 被分到其中一组。 如果以下条件成立&#xff0c;我们说这个分组方案是合法的&#xff1a; 对于每个组 g &#xff0c;同一…...

uniapp map地图实现marker聚合点,并点击marker触发事件

1.uniapp官方文档说明 2.关键代码片段 // 仅调用初始化&#xff0c;才会触发 on.("markerClusterCreate", (e) > {})this._mapContext.initMarkerCluster({enableDefaultStyle: false, // 是否使用默认样式zoomOnClick: true, // 点击聚合的点&#xff0c;是否…...

【Mysql】Mysql中的B+树索引(六)

概述 从上一章节我们了解到InnoDB 的数据页都是由7个部分组成&#xff0c;然后各个数据页之间可以组成一个双向链表 &#xff0c;而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表 &#xff0c;每个数据页都会为存储在它里边儿的记录生成一个页目录 &#xff…...

【Dockerfile镜像实战】构建LNMP环境并运行Wordpress网站平台

这里写目录标题 一、项目背景和要求二、项目环境三、部署过程1&#xff09;创建自定义网络2&#xff09;部署NginxStep1 创建工作目录并上传相关软件包Step2 编写Dockerfile文件Step3 编写配置文件nginx.confStep4 创建nginx镜像Step5 运行容器 3&#xff09;部署MysqlStep1 创…...

【工具】利用ffmpeg将网页中的.m3u8视频文件转化为.mp4格式

目录 0.环境 1.背景 2.前提 3.详细描述 1&#xff09;在网站上找到你想下载的视频的.m3u8链接 2&#xff09;打开命令行&#xff0c;用ffmpeg命令进行转化 3&#xff09;过程&结果截图 0.环境 windows64 ffmpeg 1.背景 网页上有个.m3u8格式的视频文件&#xff0c;…...

Git简洁安装方式和使用方式【附安装包资源,Git基础操作,如拉取项目、上传代码、拉取代码】

文章目录 软件安装包安装步骤常用使用方式注意拉取项目上传代码或文件选择文件添加到本地Git存储库的缓存区将缓存区的更改提交到本地Git存储库&#xff0c;并设置提交信息将本地Git存储库的更新推送到远程Git仓库中上传示例拉取别人所上传的代码 常见问题上传代码失败&#xf…...

【29】c++设计模式——>策略模式

策略模式 C中的策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许在运行时选择算法的行为。策略模式通过将算法封装成独立的类&#xff0c;并且使它们可以互相替换&#xff0c;从而使得算法的变化独立于使用算法的客户端。 策略模式通…...

2023Jenkins连接k8s

首先配置k8s config文件 1.方式获取k8s密钥 cat .kube/config 2.导出方式或者密钥 kubectl config view --raw > k8s-config-admin pipeline {agent {kubernetes {yaml apiVersion: v1kind: Podmetadata:labels:some-label: devopsspec:containers:- name: dockerimage: d…...

SpringBoot 入门 参数接收 必传参数 数组 集合 时间接收

接口声明 RestController //表示该类为请求处理类public class HttpDeal {RequestMapping("/login")//这个方法处理哪一个地址过来的请求public String hello(){return "返回给浏览器";}}接收参数 RequestMapping("/login")public String logi…...

【Qt之JSON文件】QJsonDocument、QJsonObject、QJsonArray等类介绍及使用

Qt之JSON相关类介绍 QJsonDocument常用函数枚举类型 QJsonDocument::DataValidation枚举类型 QJsonDocument::JsonFormat构造函数静态函数成员函数示例 QJsonObject常用函数构造函数&#xff1a;成员函数&#xff1a; QJsonObject 与 QVariantMap 相互转换 QJsonArray常用函数构…...

阿里云今年有双十一活动吗?不好说

阿里云今年有双十一活动吗&#xff1f;不好说&#xff0c;因为去年就没有。阿里云双11优惠活动是一项大型的促销活动&#xff0c;每年都有&#xff0c;但是去年没有双十一活动&#xff0c;不知道今年2023年阿里云是否有双11优惠活动。但是阿里云百科aliyunbaike.com猜想&#x…...

【驱动开发】创建设备节点、ioctl函数的使用

一、控制三盏灯的亮灭 头文件&#xff1a; #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t; #define PHY_LED1_ADDR 0X50006000 #def…...

Tomcat启动控制台乱码问题

修改Tomcat/conf/logging.properties...

学习周总结

http://t.csdnimg.cn/DKki2 http://t.csdnimg.cn/NvudJ 项目进度 做了大概的主界面&#xff0c;然后做了一个客户端和服务端的分离&#xff0c;实现了在客户端发送的信息&#xff0c;在服务端能收到&#xff1b;客户端和服务端的制作是我之前有写的一个http://t.csdnimg.cn/…...

如何在不恢复出厂设置的情况下解锁 Android 手机密码?

当您忘记 Android 手机的密码时&#xff0c;可能会有压力&#xff0c;尤其是当您不想恢复出厂设置并删除所有数据时。但是&#xff0c;有一些方法可以在不诉诸如此激烈的步骤的情况下解锁手机。我们将在这篇文章中教您如何在不恢复出厂设置的情况下解锁 Android 手机密码。我们…...

移动设备管理对企业IT 安全的增强

移动设备管理 &#xff08;MDM&#xff09; 是通过定义策略和部署安全控制&#xff08;如移动应用程序管理、移动内容管理和条件 Exchange 访问&#xff09;来管理移动设备的过程。 完整的MDM解决方案可以管理在Android&#xff0c;iOS&#xff0c;Windows&#xff0c;macOS&a…...

app分发的一些流程

应用分发的流程通常包括以下步骤&#xff1a; 开发应用程序&#xff1a;首先&#xff0c;您需要开发您的应用程序。这包括编写代码、设计用户界面、测试应用程序等等。确保您的应用程序符合各个应用商店的规范和要求&#xff0c;以确保顺利通过审核。 准备应用材料&#xff1a…...

深入浅出讲解Spring IOC和DI的区别

Spring IOC和DI的区别 一&#xff0c;介绍 前言 很多人都会把ioc和di说成同一个东西&#xff0c;其实IOC和DI虽然在概念上可以笼统地视为同一事物&#xff0c;但其本质上存在区别。IOC&#xff08;Inverse of Control&#xff0c;控制反转&#xff09;从容器的角度描述&#…...

文件操作 IO

文件(File) 狭义的文件: 指的是硬盘上的文件和目录 广义的文件: 泛指计算机中很多软硬件资源(操作系统中把很多硬件和软件资源抽象成了文件, 按照文件的方式同意管理) 本章内容只讨论狭义的文件 路径 绝对路径: 以c: , d: 盘符开头的路径相对路径: 以当前所在的目录为基准(…...

ARouter - 组件化通信方案

官网 https://github.com/alibaba/ARouter/blob/master/README_CN.md 项目简介 一个用于帮助 Android App 进行组件化改造的框架 —— 支持模块间的路由、通信、解耦 功能介绍 支持直接解析标准URL进行跳转&#xff0c;并自动注入参数到目标页面中支持多模块工程使用支持添…...

2025最权威的十大AI论文平台解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 对于学术写作而言&#xff0c;论文AI工具已然成了辅助开展研究、优化表达的一种重要资源。这…...

告别盲调:在KEIL中精准监控与优化栈空间使用

1. 为什么嵌入式开发中栈空间如此重要&#xff1f; 在嵌入式开发中&#xff0c;栈空间的管理往往被很多开发者忽视&#xff0c;直到系统出现莫名其妙的崩溃才追悔莫及。我刚开始做嵌入式开发时&#xff0c;也经常遇到程序运行一段时间后突然死机的情况&#xff0c;调试起来特别…...

数据结构(四) 栈和队列 超详细讲解(原理 + 完整代码 + 算法题)

数据结构(四) 栈和队列 超详细讲解&#xff08;原理 完整代码 算法题&#xff09; 栈和队列是数据结构中最基础、最常用的两种线性结构&#xff0c;掌握它们是学习算法、操作系统、编译原理的基础。本文带你从概念 → 结构实现 → 高频算法题一站式吃透。 文章目录数据结构(…...

保姆级教程:在CentOS 7上手动安装ClickHouse 21.9.4.35(附目录解析与DBeaver连接)

深度掌控&#xff1a;CentOS 7下手动部署ClickHouse全流程精解 在数据驱动的时代&#xff0c;掌握一款高性能分析型数据库的底层部署逻辑已成为数据工程师的必备技能。不同于一键式安装包带来的"黑箱"体验&#xff0c;手动解压安装ClickHouse能让你真正理解这个列式存…...

LangChain 面试问答指南2

LangChain 面试问答指南 文章目录LangChain 面试问答指南简介核心技术1. 什么是 LangChain&#xff1f;2. LangChain 的主要组件架构设计1. LangChain 的架构设计2. 链&#xff08;Chains&#xff09;的设计工具调用1. 工具调用的实现2. ReAct 模式RAG 实现1. RAG 基本原理2. R…...

淘金币自动化脚本:每天5分钟,轻松完成淘宝全任务,节省20分钟宝贵时间

淘金币自动化脚本&#xff1a;每天5分钟&#xff0c;轻松完成淘宝全任务&#xff0c;节省20分钟宝贵时间 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本&#xff0c;包含蚂蚁森林收取能量&#xff0c;芭芭农场全任务&#xff0c;解放你的双手 项目地址: https://gitcode.…...

别再傻傻分不清了!EMC、EMI、EMS、TVS、ESD,硬件工程师必懂的5个电磁兼容概念

硬件工程师的电磁兼容必修课&#xff1a;5大核心概念深度解析 刚入行的硬件工程师们&#xff0c;是否经常被各种电磁兼容术语搞得晕头转向&#xff1f;EMC、EMI、EMS、TVS、ESD这些看似相似的缩写&#xff0c;在实际电路设计中却扮演着截然不同的角色。今天我们就来彻底理清这些…...

解码NR(三):5G Type I 码本(codebook)的数学原理与波束赋形

1. 5G Type I码本的基础概念 想象一下你在一个嘈杂的会议室里&#xff0c;想要让对面的人听清你说的话。你会怎么做&#xff1f;很自然地&#xff0c;你会把手拢在嘴边&#xff0c;让声音朝着特定方向传播。这就是波束赋形(Beamforming)最朴素的理解——通过控制信号的发射方向…...

图解Kruskal+启发式合并:如何高效求解图上任意两点间的“次优瓶颈”边?

图解Kruskal与启发式合并&#xff1a;动态连通性中的次优瓶颈边高效解法 当我们需要在庞大的无向图中快速回答"两点间所有简单路径中第二大边权的最小值"这类问题时&#xff0c;传统暴力方法往往力不从心。想象一下城市道路网中寻找两条地点间"第二拥堵路段&quo…...

从零到一:用CH32V103和逐飞库搞定智能车循迹(附完整代码和避坑指南)

从零到一&#xff1a;基于CH32V103的智能车循迹系统全流程实战 第一次接触智能车循迹项目时&#xff0c;面对琳琅满目的硬件和复杂的控制算法&#xff0c;很多初学者都会感到无从下手。本文将带你完整走一遍从硬件选型到PID调参的全过程&#xff0c;使用CH32V103R8T6作为主控芯…...