n 位用户参加活动,他们的 ID 从 0 到 n - 1,每位用户都 恰好 属于某一用户组。给你一个长度为 n 的数组

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

解题思路

由题可知 所给数组groupSizes下标即为用户的id,数组的值是所对应的组成员的人数,那么将组成员人数相同的所有成员id组成一个链表,然后保存在map集合中,集合的键就是组员人数,对应的值是保存了所有组成员人数为键值的成员id

  1. 取出所有的组成员人数的集合,我是用set集合的特性直接去重的,
  2. 创建一个hashmap集合,用来存储组成员人数和对应的成员ID的键值对,
  3. 遍历map,取出所有的键值对,然后判断每个键对应的list列表里面的人数是不一个组,(比如键值是3,但是列表中的元素个数是6,那么就代表着,总的有两个人数为3的组别)如果不是那么就进行分组;
 static class Solution {
        public List<List<Integer>> subtractProductAndSum(int[] groupSizes) {

            HashMap<Integer, ArrayList>  CouMap = new HashMap<>();
            HashSet<Integer> couset = new HashSet<>();

            for (int i = 0; i < groupSizes.length; i++) {
                couset.add(groupSizes[i]);
            }

            for (Integer integer : couset) {
                ArrayList<Integer> list = new ArrayList<>();
                CouMap.put(integer,list);
                for (int i = 0; i < groupSizes.length; i++) {
                    if (integer == groupSizes [i]){
                        ArrayList arrayList = CouMap.get(integer);
                        arrayList.add(i);
                    }
                }
            }
            List<List<Integer>> arrayList = new ArrayList<>();
            Iterator<Map.Entry<Integer, ArrayList>> iterator = CouMap.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry<Integer, ArrayList> next = iterator.next();
                Integer key = next.getKey();
                //存储每个单元格用户的id的list集合
                ArrayList arrayList1 = CouMap.get(key);
                int size = arrayList1.size();
                int index = size / key;
                if (index != 1) {
                    for (int i = 0; i < size; i+= key) {

                        List list = arrayList1.subList(i, i+key);
                        arrayList.add(list);
                    }
                }else {
                    arrayList.add(arrayList1);
                }
            }
            return  arrayList;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值