携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情
快乐周五啦!!!,虽然还是待在这个破公司,但周末真的治愈
用户分组
该题出自力扣的1282题 —— 用户分组【中等题】,但其实确实不难啊,定位到中等可能是有点迷糊
审题
-
该题题意确实难懂,我是看了评论区才懂得题意,给出一个整型数组,返回一个列表
-
这道题是要我们将数组中值相等的索引放到一个分组中
- 整型数组的每一个数值代表了所能承受的数组大小,需要把相同数值的归并到一个列表内,并存放对应的下标
- 数组的索引对应的是用户的 ID。例如用户 0 所在组大小为 2,也就是说这个组有 2 个人。然后索引 5,也就是用户 5 所在的用户组也是 2。说明用户 0 和用户 5 是在一个组。索引 1,也就是用户 1 所在的组为 1
-
那么剩下的就是解题思路了
- 首先开辟一个返回结果的列表,以及一个存放值的HashMap,key为值,value为List列表
- 循环数组
- 利用HashMap的containKey方法判断是否存在该值
- 存在则放进Map内,并且对长度进行校验
- 不存在则直接new 一个列表并塞进去
- 最终再次循环,并直接addAll进结果列表
- 返回列表
-
时间复杂度O(n),只需要遍历一次即可
-
空间复杂度较高,因为开辟了HashMap和返回的List列表
编码
class Solution {
public List<List<Integer>> groupThePeople(int[] groupSizes) {
for (int i = 0;i<groupSizes.length;i++) {
int groupSize = groupSizes[i];
if (listHashMap.containsKey(groupSize)){
List<List<Integer>> list = listHashMap.get(groupSize);
List<Integer> list1 = list.get(list.size() - 1);
if (list1.size() == groupSize){
List<Integer> a = new ArrayList<>();
a.add(i);
list.add(a);
}else {
list1.add(i);
}
listHashMap.put(groupSize,list);
}else {
List<List<Integer>> list = new ArrayList<>();
List<Integer> a = new ArrayList<>();
a.add(i);
list.add(a);
listHashMap.put(groupSize,list);
}
}
listHashMap.forEach((k,v) -> {
lists.addAll(v);
});
return lists;
}
HashMap<Integer,List<List<Integer>>> listHashMap = new HashMap<>();
List<List<Integer>> lists = new ArrayList<>();
}