网站正能量免费软件,网站开发设计中的收获,网站建设需要在哪备案,查找关键词的工具叫什么本文属于「征服LeetCode」系列文章之一#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁#xff0c;本系列将至少持续到刷完所有无锁题之日为止#xff1b;由于LeetCode还在不断地创建新题#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章… 本文属于「征服LeetCode」系列文章之一这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁本系列将至少持续到刷完所有无锁题之日为止由于LeetCode还在不断地创建新题本系列的终止日期可能是永远。在这一系列刷题文章中我不仅会讲解多种解题思路及其优化还会用多种编程语言实现题解涉及到通用解法时更将归纳总结出相应的算法模板。 为了方便在PC上运行调试、分享代码文件我还建立了相关的仓库。在这一仓库中你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解还可以一同分享给他人。 由于本系列文章的内容随时可能发生更新变动欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。 有 n 个人被分成数量未知的组。每个人都被标记为一个从 0 到 n - 1 的唯一ID 。
给定一个整数数组 groupSizes 其中 groupSizes[i] 是第 i 个人所在的组的大小。例如如果 groupSizes[1] 3 则第 1 个人必须位于大小为 3 的组中。
返回一个组列表使每个人 i 都在一个大小为 groupSizes[i] 的组中。
每个人应该 恰好只 出现在 一个组 中并且每个人必须在一个组中。如果有多个答案返回其中 任何 一个。可以 保证 给定输入 至少有一个 有效的解。
示例 1
输入groupSizes [3,3,3,3,3,1,3]
输出[[5],[0,1,2],[3,4,6]]
解释
第一组是 [5]大小为 1groupSizes[5] 1。
第二组是 [0,1,2]大小为 3groupSizes[0] groupSizes[1] groupSizes[2] 3。
第三组是 [3,4,6]大小为 3groupSizes[3] groupSizes[4] groupSizes[6] 3。
其他可能的解决方案有 [[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 n1 n 5001 groupSizes[i] n 解法 哈希表
由于给定的输入一定存在有效的解因此对于数组 g r o u p S i z e s groupSizes groupSizes 中的每个元素 x x x 当 x x x 在数组中出现 y y y 次时 y y y 一定能被 x x x 整除且大小为 x x x 的组有 y x \dfrac{y}{x} xy 个。
首先将每个人的编号按照组的大小划分使用哈希表记录每个组的大小对应的所有人的编号。然后遍历哈希表对于大小为 x x x 的组得到对应的所有人编号列表将列表的大小记为 y y y 则 y y y 一定能被 x x x 整除将列表分成 y x \dfrac{y}{x} xy 个大小为 x x x 的组并将每个组添加到答案中。遍历结束之后即完成分组。
考虑示例 1 的分组。根据数组 g r o u p S i z e s groupSizes groupSizes 得到每个组的大小对应的所有人的编号
大小为 1 1 1 的组对应的编号列表是 [ 5 ] [5] [5] 大小为 3 3 3 的组对应的编号列表是 [ 0 , 1 , 2 , 3 , 4 , 6 ] [0, 1, 2, 3, 4, 6] [0,1,2,3,4,6] 。将每个组的大小对应的编号列表分成特定大小的列表。大小为 1 1 1 的组对应的编号列表的长度是 1 1 1 因此有 1 1 1 个大小为 1 1 1 的组 [ 5 ] [5] [5] 。大小为 3 3 3 的组对应的编号列表的长度是 6 6 6 因此有 2 2 2 个大小为 3 3 3 的组 [ 0 , 1 , 2 ] , [ 3 , 4 , 6 ] [0, 1, 2], [3, 4, 6] [0,1,2],[3,4,6] 。
最终分组情况是 [ [ 5 ] , [ 0 , 1 , 2 ] , [ 3 , 4 , 6 ] ] [[5], [0, 1, 2], [3, 4, 6]] [[5],[0,1,2],[3,4,6]] 。
class Solution {
public:vectorvectorint groupThePeople(vectorint groupSizes) {unordered_mapint, vectorint rec;vectorvectorint ans;for (int i{}; auto v : groupSizes) {rec[v].push_back(i);if (rec[v].size() v)ans.push_back(exchange(rec[v], {}));}return ans;}
};复杂度分析
时间复杂度 O ( n ) O(n) O(n)空间复杂度 O ( n ) O(n) O(n)