1282、用户分组

2023-10-27

题目描述:

有 n 位用户参加活动,他们的 ID 从 0 到 n - 1,每位用户都 恰好 属于某一用户组。给你一个长度为 n 的数组 groupSizes,其中包含每位用户所处的用户组的大小,请你返回用户分组情况(存在的用户组以及每个组中用户的 ID)。

你可以任何顺序返回解决方案,ID 的顺序也不受限制。此外,题目给出的数据保证至少存在一种解决方案。

 

示例 1:

输入:groupSizes = [3,3,3,3,3,1,3]
输出:[[5],[0,1,2],[3,4,6]]
解释: 
其他可能的解决方案有 [[2,1,6],[5],[0,4,3]] 和 [[5],[0,6,2],[4,3,1]]。
示例 2:

输入:groupSizes = [2,1,3,3,3,2]
输出:[[1],[0,5],[2,3,4]]
 

提示:

groupSizes.length == n
1 <= n <= 500
1 <= groupSizes[i] <= n

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/group-the-people-given-the-group-size-they-belong-to
 

解题思路:

  1. 一开始是冲着贪心的标签做这题的,不知道是我太菜了还是怎么回事,觉得这题和贪心似乎关系不大?
  2. 数据数量有限,就直接做分类了,对所有的“所处用户组数量大小相同”的数据,记录其下标,并且分别记录每个用户组数量下的数据总数(有点绕口,比如说某几个数据,其所处用户组大小为3,记录这几个数据的总数),之后就对做好分类的数据做处理就可以了;
  3. 把已经分好类的数据以此填充到返回数组中即可。

 

个人疑虑:

  1. 一开始没有用题目给出的最大范围来开辟数组空间,想节省内存。在数据分类、将分类完的数据填充到返回数组时,使用了大量的realloc。使用原因:如果直接用最大范围开辟数组空间,会有一部分的空间没有被使用到,造成空间浪费,就想着确定要用了,然后再去开辟,结果时间和空间耗用都不尽如人意。
    下面的第一段代码空间占用大概在11.7M,时间从40~50ms都有,第二段代码的代码空间占用达到了24.5M,时间达到了64ms,具体原因和realloc的机制应该有关系,解决之后再来填补。

代码一,时间、内存都还算可以的代码

int** groupThePeople(int* groupSizes, int groupSizesSize, int* returnSize, int** returnColumnSizes)
{
	int group_array[500][500] = { 0 };		//第一维:用户组长度
											//第二维:

	int *group_length = (int*)calloc(groupSizesSize, sizeof(int));	

	short i;						
	short k = 0;
	for (i = 0; i < groupSizesSize; i++)
	{
		k = groupSizes[i] - 1;					//

		if (k < 0 || k >= 500)
			continue;

		group_array[k][group_length[k]] = i;	//将当前下标数据存到相应数组

		group_length[k]++;						//当前长度的用户组数量+1
	}

	int** ret_res = (int*)malloc(sizeof(int*)*groupSizesSize);	//暂时所有长度,包含无用长度
	(*returnColumnSizes) = (int*)malloc(sizeof(int)*groupSizesSize);

	*returnSize = 0;		//清零

	int n;

	for (i = 0; i < groupSizesSize; i++)		//所有用户组长度进行遍历
	{
		n = 0;									//

		while (group_length[i] > 0)			//当前数组长度仍然大于0,即没有全部分类完成
		{
			(*returnColumnSizes)[*returnSize] = i + 1;		//指示当前一维数组的长度


			ret_res[*returnSize] = (int*)malloc(sizeof(int)*(i + 1));	//当前数组有i+1个int数据 

			for (k = 0; k <= i; k++)		//i 是用户组数-1  所以要加上等号
			{
				ret_res[*returnSize][k] = group_array[i][n];

				n++;
				group_length[i]--;
			}

			*returnSize += 1;
		}

	}

	return ret_res;

}

 

第二段代码,时间、内存占用都很高的代码

int** groupThePeople(int* groupSizes, int groupSizesSize, int* returnSize, int** returnColumnSizes)
{
	int group_array[500][500] = { 0 };		//第一维:用户组长度
											//第二维:

	int *group_length = (int*)calloc(groupSizesSize, sizeof(int));	

	short i;				
	short k = 0;
	for (i = 0; i < groupSizesSize; i++)
	{
		k = groupSizes[i] - 1;					//

		if (k < 0 || k >= 500)
			continue;

		group_array[k][group_length[k]] = i;	//将当前下标数据存到相应数组

		group_length[k]++;						//当前长度的用户组数量+1
	}

	int** ret_res = NULL;
	(*returnColumnSizes) = (int*)malloc(sizeof(int)*groupSizesSize);

	*returnSize = 0;		//清零

	int n;

	for (i = 0; i < groupSizesSize; i++)		//所有用户组长度进行遍历
	{
		n = 0;									//

		while (group_length[i] > 0)			//当前数组长度仍然大于0,即没有全部分类完成
		{
			//(*returnColumnSizes) = (int*)realloc(*returnColumnSizes, sizeof(int)*(*returnSize + 1));
			(*returnColumnSizes)[*returnSize] = i + 1;		//指示当前一维数组的长度

			//需要的时候再把返回数组延长
			ret_res = (int*)realloc(ret_res, sizeof(int*)*(*returnSize + 1));
			ret_res[*returnSize] = (int*)malloc(sizeof(int)*(i + 1));	//当前数组有i+1个int数据 

			for (k = 0; k <= i; k++)		//i 是用户组数-1  所以要加上等号
			{
				ret_res[*returnSize][k] = group_array[i][n];

				n++;
				group_length[i]--;
			}

			*returnSize += 1;
		}

	}

	return ret_res;

}

 

以下属于菜鸟的知识点总结,是知识漏洞,之前没有细看过。

  1. 之前没有在实际项目中使用二级指针做形参过,这个函数中形参int** returnColumnSizes,一开始以为是传了一个二维数组进去,我在VS中直接int** return_column_sizes,然后调用函数的时候报错。
    后来才搞明白其实就是传了个一维数组进去,只不过传的不是一维数组的起始地址,而是传了一个指向这个地址的指针。
    举个例子,定义了一个数组 int array[100],如果直接使用 array,array的值就是array[100]这个数组的起始地址;&array,就是array的地址,这个地址中存的数据是array[100]这个数组的起始地址。
    函数中,int** returnColumnSizes 这个形参的位置,就应该放 &array,那么函数中 *returnColumnSizes  = array,两者都是数组的起始地址,(*returnColumnSizes)[10] = array[10],两者都是这个数组的第十个元素(此处=符号仅代表等价)。

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1282、用户分组 的相关文章

  • 写作副业怎么弄?写文章的副业应该怎么做?

    现在越来越流行 斜杠青年 这个词了 人们总是希望在做好本职工作的基础上 还能够有另外一份获取收入的工作 也就是 副业 而在 副业 的众多选项里 很多人都看好 写作 这一项 但是 当我们普通人想要开启写作之路 赚取副业收入的时候 具体应该怎么
  • 用户友好性检测

    我们一般通过三个指标来检验一个网站是否对于用户友好 这三个指标分别是 链接的可用性 访问速度体验和查找信息的便捷度 一 链接的可用性 试想 一个访问者来到你的网站 点击一个超级链接 却发现浏览器只返回一个错误404 页面 如果网页中不可用链
  • Unity3D 引擎学习2022资料整理(二)

    Utils C APR Apache Portable Runtime 另一个跨平台的实用函数库 Apache2 0 官网 C Algorithms 一个常用算法和数据结构的集合 官网 CPL The Common Pipeline Lib
  • edge浏览器受信任_Edge 浏览器如何添加信任站点

    Microsoft Edge 无法添加信任站点 组策略没有批量设置 只能逐条设置 然后从DC推到所向域内客户端 如果你是用Site to Zone Assignment List Enabled策略或来设置信任站点的话 客户端确实无法手动添
  • OpenHarmony之docker容器的基本用法

    Docker使用示例 docker移植至OpenHarmony的过程可参考 https blog 51cto com u 14601312 5692202 下面以rk3568 OpenHarmony为例 介绍一下如何进行容器制作 导入及使用
  • 一招解决报错:pyassimp.errors.AssimpError: assimp library not found

    文章目录 1 问题描述 2 原因分析 3 解决方法 1 问题描述 在使用pip install pyassimp安装pyassimp库后 调用时会出现错误 File root anaconda3 envs kgn lib python3 8
  • qt5.12.10 在linux(国产系统)的源码编译、移植问题记录

    1 概述 Qt版本 Qt5 12 10 Qt 官网下载地址 Qt官网 路径 Qt5 12 10源码目录目录下下载 qt everywhere src 5 12 10 tar xz 编译平台 方德 其余架构亦可考 2 编译源码记录 1 下载源
  • Flutter 最常出现的错误

    哔哩哔哩漫画APP实践Flutter也有大半年时间了 我针对线上收集到的错误进行分析 挑选出了一些有一般代表性的错误 列在本文 可供实践 Flutter 的初学者们作为一点参考 典型错误一 无法掌握的Future 典型错误信息 NoSuch
  • spring boot 实现注解+自定义配置多数据库

    spring boot 实现注解 自定义配置多数据库 配置多数据库 注解 AOP maven依赖 多数据源配置 代码实现 存在问题 配置多数据库 注解 AOP 你好 这是你第一次使用 Markdown编辑器 所展示的欢迎页 如果你想学习如何
  • shell编程(六) : [shell基础] 基本shell脚本

    接上一篇文章Linux shell编程 五 Linux文件权限管理 三 Linux shell 脚本编程基础 了解了Linux系统和命令行的基础知识 是时候开始编程了 3 1 基本shell脚本 shell脚本的关键在于输入多个命令并处理每
  • Google-Guava-EventBus源码解读

    Guava是Google开源的一个Java基础类库 它在Google内部被广泛使用 Guava提供了很多功能模块比如 集合 并发库 缓存等 EventBus是其中的一个module 本篇结合EventBus源码来谈谈它的设计与实现 概要 首
  • 基础算法题——奇怪的分式(避免小数运算)

    奇怪的分式 上小学的时候 小明经常自己发明新算法 一次 老师出的题目是 1 4 乘以 8 5 小明居然把分子拼接在一起 分母拼接在一起 答案是 18 45 参见图1 png 老师刚想批评他 转念一想 这个答案凑巧也对啊 真是见鬼 对于分子
  • 强大的.NET反编译工具Reflector及插件

    刚接触 net 时就听说 Reflector这个强大反编译工具呢 只是一直没有去使用他 今天update跟我说Reflector如何 如何有用 用的如何 如何爽 还得意的说反编译了不少DLL 本来本人对新鲜事就非常有兴趣 听他这么一说 决定
  • Oracle 存储过程 与 函数 区别

    定义 存储过程 Stored Procedure 是一组为了完成特定功能的SQL 语句集 经编译后存储在数据库中 用户通过指定存储过程的名字并给出参数 如果该存储过程 带有参数 来执行它 存储过程是数据库中的一个重要对象 任何一个设计良好的
  • video-05-videojs编写(全屏、非全屏)自定义控件!!!!

    兄弟们 看到这里 你马上就可以自定义控件了 想想是不是都激动啊 但是这篇文章重在思路及简单实现 仔细看 目录 一 控件分类 二 实现方案 方案二最好 2 1 方案1 只能实现非全屏控件 2 1 1 思路 2 1 2 效果 2 1 3 代码
  • Ableton Live 10 Suite v10.1.42 WiN-MAC 音乐制作宿主软件

    Ableton Live 10 是一个专业的电子音乐制作 现场表演宿主软件 使用 Ableton Live 10 的新设备创造更大胆的声音 通过大量的工作流程改进保持在流程中 使用 Push 可以在远离计算机的地方做更多事情 使用精选库构建
  • Vue中$event的用法

    因为在Vue API文档里 event的用法找不到 所以我自己总结了一下 通常的用法是用来获取当前元素的最新值 event target value div div
  • 七牛云linux命令行工具(qshell)

    qshell下载 wget http devtools qiniu com qshell linux x64 v2 4 2 zip 解压zip 安装 qshell 解压 qshell包 unzip qshell zip 剪辑到 home 文
  • TCP的拥塞控制算法

    前言 防止过多的数据注入网络中 这样可以使网络中的路由器或链路不会过载 若出现拥塞而不进行控制 整个网络的吞吐量将随输入负荷的增大而下降 当输入的负载到达一定程度 吞吐量不会增加 即一部分网络资源会丢失掉 网络的吞吐量维持在其所能控制的最大

随机推荐

  • expiringmap 设置key 过期时间

  • 新方案unity配表工具

    工具下载 网盘链接 工具结构 针对每张表格生成一个表格类 其中默认包含一个list和字典类型参数记录表格数据 初始化项目时将list中的数据转为按id索引的dictionary 用于访问数据 额外包含一个同名Temp后缀的类 记录表格的字段
  • Session详解,学习Session(包含底层分析和使用)

    什么是session session在网络应用中称为 会话控制 是服务器为了保存用户状态而创建的一个特殊的对象 简而言之 session就是一个对象 用于存储信息 session和cookie的比较 cookie保存在客户端 session
  • C# 数据库存储过程的讲解应用

    在使用VS 2012 SQL Server做简单的销售系统中 通常会遇到一些使用存储过程的情况 那究竟什么是存储过程 它的好处是什么呢 如果在SQL Server中创建一个存储过程 C 中怎样联系存储过程呢 一 存储过程 存储过程 Stor
  • C++类和对象上篇

    面向过程和面向对象的初步认识 C语言是面向过程的 关注点在于过程 分析出求解问题的步骤 通过函数调用逐步解决问题 C 是面向对象的 关注点在于对象 将一件事拆分成不同的对象 靠对象之间的交互完成 我们就外卖系统来看看面向过程和面向对象之间的
  • RabbitMQ提示错误:java.net.SocketException socket closed

    RabbitMQ提示错误 java net SocketException socket closed问题 原因是配置的用户权限问题 rabbitmq包括很多种权限 需要把在项目中配置的账户修改为management类型 权限规则 http
  • flutter开发实战-MethodChannel实现flutter与iOS双向通信

    div class markdown views div
  • 对于cin提取输入流遇到空格的问题

    引子老谭CPP教材 流提取符 gt gt 从流中提取数据时通常跳过流中的空格 tab键换行符等空白字符 P430页倒数第10行 13 3 1 cin流 用cin gt gt 读取数据时遇到空白字符 包括空格 tab键和回车 作为终止字符 P
  • Eigen学习教程(三)

    Eigen学习教程 三 3 稠密线性问题与分解 本节说明了如何求解线性系统 计算各种分解 例如LU QR SVD 本征分解 阅读此节后 请不要错过我们的密集矩阵分解目录 基本线性求解 Ax b 该解决方案 可将各种分解之间进行选择 取决于你
  • 计算机英特尔显卡在哪找,Win10英特尔显卡设置在哪里 英特尔核芯显卡控制面板六大功能详解...

    Win10系统用户体验相比以前的系统更好 有些用户为了让显卡发挥作用 会在win10里设置显卡功能 显卡设置在哪里 显卡控制面板 显卡控制面板有Intel AMD NVADIA三种 我们通过显卡的控制面板进行显卡更为高级的设置 这时我们就需
  • MATLAB快速入门(一)

    一 简介 本篇参考官方入门文档编写 前提准备 MATLAB 二 快速入门 一 1 桌面基础知识 启动 MATLAB 时 桌面会以默认布局显示 桌面包括下列面板 当前文件夹 访问您的文件 命令行窗口 在命令行中输入命令 由提示符 gt gt
  • c++--标准模板库(STL)

    要看懂STL相关 必须了解c 模板 目录 STL是什么 c 标准模板库包含三个组件 算法 迭代器 迭代器的种类 示例程序 容器 常用的容器 编程练习 string 字符串容器 vector 向量 list 双向链表容器 queue 队列容器
  • Excel 的那些事儿啊

    RIGHT 函数 功能 可以对数值 字符串 进行截取 是从后面开始截取的 语法 RIGHT 截取的数值 截取的个数 使用 例如我们想提前 ID 列中数值的后面的数字 可以使用该函数 1 书写函数 RGIHT A3 3 对 A3 单元格进行截
  • mysql中on duplicate key update用法(批量操作数据、存在更新,不存在则新增),附mybatis配置

    1 应用场景 日常开发中 对于一个数据想做到存在即更新 不存在则新增 通常的做法是先查询数据库中是否存在对应的数据 如果存在就使用更新的方法 不存在就使用新增的方法 如果是单个数据 倒也没什么问题 但如果是批量数据的话 会消耗大量的资源来进
  • 字符串截取之substring_index

    substring index str delim count str 要处理的字符串 delim 分隔符 count 计数 例子 str www wikidm cn substring index str 1 结果是 www substr
  • 自主开发悟空crm增加 公文管理功能 二次开发代码披露

    1 招聘需求 2 审核刚刚创建的招聘需求内容 3 编辑内容 4 简历管理 5 面试记录时间轴 6 offer管理
  • golang interface判断为空nil

    一个接口包括动态类型和动态值 如果一个接口的动态类型和动态值都为空 则这个接口为空的 func IsNil i interface bool vi reflect ValueOf i if vi Kind reflect Ptr retur
  • 【性能测试】性能测试之性能测试指标详解(详细)

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • 华为数通方向HCIP-DataCom H12-831题库(单选题:21-40)

    第21题 R3与R1的IS IS邻居没有建立 根据本图的信息 可能的原因是 A R3与R1的IIH认证失败 B R3与R1的System ID重复 C R3与R1的IS Level不匹配 D R3与R1的互连接口circuit type不匹
  • 1282、用户分组

    题目描述 有 n 位用户参加活动 他们的 ID 从 0 到 n 1 每位用户都 恰好 属于某一用户组 给你一个长度为 n 的数组 groupSizes 其中包含每位用户所处的用户组的大小 请你返回用户分组情况 存在的用户组以及每个组中用户的