算法小知识-----8.12-----用户分组

65 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情

快乐周五啦!!!,虽然还是待在这个破公司,但周末真的治愈

用户分组

该题出自力扣的1282题 —— 用户分组【中等题】,但其实确实不难啊,定位到中等可能是有点迷糊

审题

image.png

  • 该题题意确实难懂,我是看了评论区才懂得题意,给出一个整型数组,返回一个列表

  • 这道题是要我们将数组中值相等的索引放到一个分组中

    • 整型数组的每一个数值代表了所能承受的数组大小,需要把相同数值的归并到一个列表内,并存放对应的下标
    • 数组的索引对应的是用户的 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<>();
}

image.png