1282-用户分组
Posted angelica-duhurica
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1282-用户分组相关的知识,希望对你有一定的参考价值。
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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/group-the-people-given-the-group-size-they-belong-to
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
public List<List<Integer>> groupThePeople(int[] groupSizes) {
Map<Integer, List<Integer>> map = new HashMap<>();
for (int i = 0; i < groupSizes.length; i++) {
int item = groupSizes[i];
List<Integer> list = map.getOrDefault(item, new ArrayList<>());
list.add(i);
map.put(item, list);
}
List<List<Integer>> res = new ArrayList<>();
for(Integer key : map.keySet()) {
List<Integer> list = map.get(key);
if(list.size() == key) {
res.add(list);
} else {
List<Integer> item = new ArrayList<>();
for(int i = 0; i < list.size(); i++) {
item.add(list.get(i));
if((i + 1) % key == 0) {
res.add(item);
item = new ArrayList<>();
}
}
}
}
return res;
}
简化:
public List<List<Integer>> groupThePeople(int[] groupSizes) {
Map<Integer, List<Integer>> map = new HashMap<>();
List<List<Integer>> res = new ArrayList<>();
for (int i = 0; i < groupSizes.length; i++) {
int item = groupSizes[i];
List<Integer> list = map.getOrDefault(item, new ArrayList<>());
list.add(i);
if(list.size() == item) {
res.add(list);
map.put(item, new ArrayList<>());
} else {
map.put(item, list);
}
}
return res;
}
改进:
public List<List<Integer>> groupThePeople(int[] groupSizes) {
Map<Integer, List<Integer>> map = new HashMap<>();
List<List<Integer>> res = new ArrayList<>();
int[] forTime = new int[groupSizes.length + 1];
for (int i = 0; i < groupSizes.length; i++) {
int item = groupSizes[i];
int cnt = forTime[item];
if(cnt == 0) {
List<Integer> list = new ArrayList<>();
map.put(item, list);
}
if(cnt + 1 == item) {
List<Integer> list = map.get(item);
list.add(i);
res.add(list);
map.put(item, new ArrayList<>());
forTime[item] = 0;
} else {
List<Integer> list = map.get(item);
list.add(i);
forTime[item]++;
map.put(item, list);
}
}
return res;
}
以上是关于1282-用户分组的主要内容,如果未能解决你的问题,请参考以下文章