每日LeetCode —— 1282. 用户分组

69 阅读2分钟

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

题目描述

       给定一个数组groupSizes,groupSizes[i]表示的是人i所在组的大小。比如groupSizes[2]=3,则表示索引为3的人所在组的大小为3。题目要求是返回一个组的列表,使得每个人索引为i的人都在大小为groupSizes[i]的组中。

例1:输入:groupSizes=[3,3,2,2,2,2,1,1,3]  输出:[[6],[7],[2,3],[4,5],[0,1,8]]

解释:可以看到的是,所在组大小为1的人的索引有6,7,所在组大小为2的人的索引有2、3、4、5,所在组大小为3的的人的索引有0、1、8。索引可以将他们分组为上面的输出的形式,当然,[[6],[7],[4,3],[2,5],[0,1,8]]、[[6],[0,1,8],[7],[2,3],[4,5]]也是为正确的分组结果。

原题地址:1282. 用户分组

解题思路

       本题首先所想到的就是利用map集合来存储各组中的索引位置,当然map的值可以为set类型也可以为数组类型。所给的结果中组与组之间的顺序可以是任意的顺序,组中成员索引的顺序也是任意顺序,不用考虑顺序的问题,所以可用无序集合以及数组来存储索引信息。存储完成后可根据map中的值来对分配组的大小以及组中的成员索引信息。

本题值得注意的地方,所输入的均为可以正确分组的数据。像[1,2]这样的即为不能正确分组的数据,不用考虑这种情况。

实现代码

class Solution {
public:
    vector<vector<int>> groupThePeople(vector<int>& groupSizes) {
        // 存储每个大小的组中的成员信息
        unordered_map<int,vector<int>> map;
        // 记录分组结果
        vector<vector<int>> res;、
        // 将每个人所在组的信息存到map中
        for(int i=0;i<groupSizes.size();i++) map[groupSizes[i]].emplace_back(i);
        // 从map中得到组的大小以及人员信息,对其进行分组
        for(auto t=map.begin(); t!=map.end(); t++){
            int num = t->second.size(),size = t->first,n=0;
            auto v = t->second;
            while(num > 0){
                num -= size;
                vector<int> vec;
                for(int i=0; i<size && n<v.size(); i++,n++) vec.push_back(v[n]);
                res.push_back(vec);
            }
        }
        return res;
    }
};