题目描述:
有 n 位用户参加活动,他们的 ID 从 0 到 n - 1,每位用户都 恰好 属于某一用户组。给你一个长度为 n 的数组 groupSizes,其中包含每位用户所处的用户组的大小,请你返回用户分组情况(存在的用户组以及每个组中用户的 ID)。可以任何顺序返回解决方案,ID 的顺序也不受限制。此外,题目给出的数据保证至少存在一种解决方案。
题解:
个人题解:保存一个$(groupsize,id)$的$vector$,对这个$vector$按照$groupsize$升序排序,优先把$groupsize$小的组凑出来。时间复杂度$O(nlogn)$,空间复杂度$O(n)$,代码如下:
class Solution { public: vector<vector<int>> groupThePeople(vector<int>& groupSizes) { vector<pair<int,int>> tmp; int Len = groupSizes.size(); for(int i=0;i<Len;i++) { tmp.push_back(make_pair(groupSizes[i],i)); } sort(tmp.begin(),tmp.end()); vector<vector<int>> ans; for(int i=0;i<Len;) { pair<int,int> now = tmp[i]; int target = i + now.first-1; vector<int> tmp_ans; while(i<=target) { tmp_ans.push_back(tmp[i].second); i++; } ans.push_back(tmp_ans); } return ans; } };
官方题解:构建一个$hashmap$,$hashmap$的$key-val$为$(gsize,users)$,$gsize$表示用户组的大小,$users$表示满足用户组大小为$gsize$的所有用户。由于使用的是$hashmap$时间复杂度为$O(N)$,空间复杂度$O(N)$。ac代码如下:
class Solution { public: vector<vector<int>> groupThePeople(vector<int>& groupSizes) { unordered_map<int, vector<int>> groups; for (int i = 0; i < groupSizes.size(); ++i) { groups[groupSizes[i]].push_back(i); } vector<vector<int>> ans; for (auto group = groups.begin(); group != groups.end(); ++group) { const int& gsize = group->first; vector<int>& users = group->second; for (auto iter = users.begin(); iter != users.end(); iter = next(iter, gsize)) { vector<int> dummy(iter, next(iter, gsize)); ans.push_back(dummy); } } return ans; } };