「每日LeetCode」2021年10月29日

本文最后更新于:2023年3月19日 晚上

Lt1282. 用户分组

1282. 用户分组

有 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

思路

其实这道题是要我们将数组中值相等的索引放到一个分组中。使用 map 存储对应的组,逐个遍历每个组是否满人,不是的话加入该组,是的话新建一个组。

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* @param {number[]} groupSizes
* @return {number[][]}
*/
var groupThePeople = function (groupSizes) {
const map = {};
for (let i = 0; i < groupSizes.length; i++) {
const element = groupSizes[i];
if (map[element]) {
let j;
for (j = 0; j < map[element].length; j++) {
const group = map[element][j];
if (group.length < element) {
group.push(i);
break;
}
}
if (j === map[element].length) map[element].push([i]);
} else map[element] = [[i]];
}
return [...Object.values(map).flat()];
};