There are n
people that are split into some unknown number of groups. Each person is labeled with a unique ID from 0
to n - 1
.
You are given an integer array groupSizes
, where groupSizes[i]
is the size of the group that person i
is in. For example, if groupSizes[1] = 3
, then person 1
must be in a group of size 3
.
Return a list of groups such that each person i
is in a group of size groupSizes[i]
.
Each person should appear in exactly one group, and every person must be in a group. If there are multiple answers, return any of them. It is guaranteed that there will be at least one valid solution for the given input.
Example 1:
Input: groupSizes = [3,3,3,3,3,1,3] Output: [[5],[0,1,2],[3,4,6]] Explanation: The first group is [5]. The size is 1, and groupSizes[5] = 1. The second group is [0,1,2]. The size is 3, and groupSizes[0] = groupSizes[1] = groupSizes[2] = 3. The third group is [3,4,6]. The size is 3, and groupSizes[3] = groupSizes[4] = groupSizes[6] = 3. Other possible solutions are [[2,1,6],[5],[0,4,3]] and [[5],[0,6,2],[4,3,1]].
Example 2:
Input: groupSizes = [2,1,3,3,3,2] Output: [[1],[0,5],[2,3,4]]
Constraints:
groupSizes.length == n
1 <= n <= 500
1 <= groupSizes[i] <= n
class Solution:
def groupThePeople(self, groupSizes: List[int]) -> List[List[int]]:
mp = defaultdict(list)
for i, x in enumerate(groupSizes):
mp[x].append(i)
res = []
for x, indexes in mp.items():
l = len(indexes)
for i in range(0, l, x):
res.append(indexes[i: i + x])
return res
class Solution {
public List<List<Integer>> groupThePeople(int[] groupSizes) {
Map<Integer, List<Integer>> mp = new HashMap<>();
for (int i = 0; i < groupSizes.length; ++i) {
mp.computeIfAbsent(groupSizes[i], k -> new ArrayList<>()).add(i);
}
List<List<Integer>> res = new ArrayList<>();
for (Map.Entry<Integer, List<Integer>> entry : mp.entrySet()) {
int x = entry.getKey();
List<Integer> indexes = entry.getValue();
for (int i = 0; i < indexes.size(); i += x) {
res.add(new ArrayList<>(indexes.subList(i, i + x)));
}
}
return res;
}
}
class Solution {
public:
vector<vector<int>> groupThePeople(vector<int>& groupSizes) {
unordered_map<int, vector<int>> mp;
for (int i = 0; i < groupSizes.size(); ++i) mp[groupSizes[i]].push_back(i);
vector<vector<int>> res;
for (auto& entry : mp)
{
int x = entry.first;
auto indexes = entry.second;
for (int i = 0; i < indexes.size(); i += x)
{
vector<int> t(indexes.begin() + i, indexes.begin() + i + x);
res.push_back(t);
}
}
return res;
}
};
func groupThePeople(groupSizes []int) [][]int {
mp := make(map[int][]int)
for i, x := range groupSizes {
mp[x] = append(mp[x], i)
}
var res [][]int
for x, indexes := range mp {
for i := 0; i < len(indexes); i += x {
res = append(res, indexes[i:i+x])
}
}
return res
}