LC 1282. 用户分组
题目描述
这是 LeetCode 上的 1282. 用户分组 ,难度为 中等。
有 n
个人被分成数量未知的组。每个人都被标记为一个从 $0$ 到 $n - 1$ 的唯一 ID
。
给定一个整数数组 groupSizes
,其中 groupSizes[i]
是第 $i$ 个人所在的组的大小。例如,如果 groupSizes[1] = 3
,则第 $1$ 个人必须位于大小为 $3$ 的组中。
返回一个组列表,使每个人 $i$ 都在一个大小为 groupSizes[i]
的组中。
每个人应该恰好只出现在 一个组中,并且每个人必须在一个组中。如果有多个答案,返回其中任何一个。可以保证给定输入至少有一个有效的解。
示例 1:1
2
3
4
5
6
7
8
9输入:groupSizes = [3,3,3,3,3,1,3]
输出:[[5],[0,1,2],[3,4,6]]
解释:
第一组是 [5],大小为 1,groupSizes[5] = 1。
第二组是 [0,1,2],大小为 3,groupSizes[0] = groupSizes[1] = groupSizes[2] = 3。
第三组是 [3,4,6],大小为 3,groupSizes[3] = groupSizes[4] = groupSizes[6] = 3。
其他可能的解决方案有 [[2,1,6],[5],[0,4,3]] 和 [[5],[0,6,2],[4,3,1]]。
示例 2:1
2
3输入:groupSizes = [2,1,3,3,3,2]
输出:[[1],[0,5],[2,3,4]]
提示:
- $groupSizes.length == n$
- $1 <= n <= 500$
- $1 <= groupSizes[i] <= n$
哈希表 + 构造
答案确保有解,可直接进行构造:假设组大小为 $k$ 的元素有 $m$ 个,则将这 $m$ 个元素按照 $k$ 个一组进行划分。
具体的,我们可以使用哈希表 map
记录当前组大小为 x
的数组容器 cur
。即组大小数值为 key
,对应容器引用为 value
。
从前往后处理每个 $x = groupSizes[i]$,若 x
不在 map
或 map[x]
大小为 x
,起一个新的组存入 map
和 ans
中,然后每次都将 i
存入到 map[x]
当中即可。
Java 代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16class Solution {
public List<List<Integer>> groupThePeople(int[] groupSizes) {
Map<Integer, List<Integer>> map = new HashMap<>();
List<List<Integer>> ans = new ArrayList<>();
for (int i = 0; i < groupSizes.length; i++) {
int x = groupSizes[i];
if (!map.containsKey(x) || map.get(x).size() == x) {
List<Integer> cur = new ArrayList<>();
map.put(x, cur);
ans.add(cur);
}
map.get(x).add(i);
}
return ans;
}
}
C++ 代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16class Solution {
public:
vector<vector<int>> groupThePeople(vector<int>& groupSizes) {
unordered_map<int, vector<int>> map;
vector<vector<int>> ans;
for (int i = 0; i < groupSizes.size(); i++) {
int x = groupSizes[i];
map[x].push_back(i);
if (map[x].size() == x) {
ans.push_back(map[x]);
map[x].clear();
}
}
return ans;
}
};
Python 代码:1
2
3
4
5
6
7
8
9
10
11class Solution:
def groupThePeople(self, groupSizes: List[int]) -> List[List[int]]:
mapping = {}
ans = []
for i, x in enumerate(groupSizes):
if x not in mapping or len(mapping[x]) == x:
cur = []
mapping[x] = cur
ans.append(cur)
mapping[x].append(i)
return ans
Typescript 代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14function groupThePeople(groupSizes: number[]): number[][] {
const map = new Map<number, Array<number>>();
const ans = new Array<Array<number>>();
for (let i = 0; i < groupSizes.length; i++) {
const x = groupSizes[i];
if (!map.has(x) || map.get(x).length == x) {
const cur = new Array<number>();
map.set(x, cur);
ans.push(cur);
}
map.get(x).push(i);
}
return ans;
};
- 时间复杂度:$O(n)$
- 空间复杂度:$O(n)$
最后
这是我们「刷穿 LeetCode」系列文章的第 No.1282
篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。
在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。
为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。
在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!