携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情
题目描述
给定一个数组groupSizes,groupSizes[i]表示的是人i所在组的大小。比如groupSizes[2]=3,则表示索引为3的人所在组的大小为3。题目要求是返回一个组的列表,使得每个人索引为i的人都在大小为groupSizes[i]的组中。
例1:输入:groupSizes=[3,3,2,2,2,2,1,1,3] 输出:[[6],[7],[2,3],[4,5],[0,1,8]]
解释:可以看到的是,所在组大小为1的人的索引有6,7,所在组大小为2的人的索引有2、3、4、5,所在组大小为3的的人的索引有0、1、8。索引可以将他们分组为上面的输出的形式,当然,[[6],[7],[4,3],[2,5],[0,1,8]]、[[6],[0,1,8],[7],[2,3],[4,5]]也是为正确的分组结果。
原题地址:1282. 用户分组
解题思路
本题首先所想到的就是利用map集合来存储各组中的索引位置,当然map的值可以为set类型也可以为数组类型。所给的结果中组与组之间的顺序可以是任意的顺序,组中成员索引的顺序也是任意顺序,不用考虑顺序的问题,所以可用无序集合以及数组来存储索引信息。存储完成后可根据map中的值来对分配组的大小以及组中的成员索引信息。
本题值得注意的地方,所输入的均为可以正确分组的数据。像[1,2]这样的即为不能正确分组的数据,不用考虑这种情况。
实现代码
class Solution {
public:
vector<vector<int>> groupThePeople(vector<int>& groupSizes) {
// 存储每个大小的组中的成员信息
unordered_map<int,vector<int>> map;
// 记录分组结果
vector<vector<int>> res;、
// 将每个人所在组的信息存到map中
for(int i=0;i<groupSizes.size();i++) map[groupSizes[i]].emplace_back(i);
// 从map中得到组的大小以及人员信息,对其进行分组
for(auto t=map.begin(); t!=map.end(); t++){
int num = t->second.size(),size = t->first,n=0;
auto v = t->second;
while(num > 0){
num -= size;
vector<int> vec;
for(int i=0; i<size && n<v.size(); i++,n++) vec.push_back(v[n]);
res.push_back(vec);
}
}
return res;
}
};