leetcode 1282 用户分组

题目描述:

  有 n 位用户参加活动,他们的 ID 从 0 到 n - 1,每位用户都 恰好 属于某一用户组。给你一个长度为 n 的数组 groupSizes,其中包含每位用户所处的用户组的大小,请你返回用户分组情况(存在的用户组以及每个组中用户的 ID)。可以任何顺序返回解决方案,ID 的顺序也不受限制。此外,题目给出的数据保证至少存在一种解决方案。

题解:

  个人题解:保存一个$(groupsize,id)$的$vector$,对这个$vector$按照$groupsize$升序排序,优先把$groupsize$小的组凑出来。时间复杂度$O(nlogn)$,空间复杂度$O(n)$,代码如下:

  

class Solution {
public:
    vector<vector<int>> groupThePeople(vector<int>& groupSizes) {
        vector<pair<int,int>> tmp;
        int Len = groupSizes.size();
        for(int i=0;i<Len;i++)
        {
            tmp.push_back(make_pair(groupSizes[i],i));
        }
        sort(tmp.begin(),tmp.end());
        vector<vector<int>> ans;
        for(int i=0;i<Len;)
        {
            pair<int,int> now = tmp[i];
            int target = i + now.first-1;
            vector<int> tmp_ans;
            while(i<=target)
            {
                tmp_ans.push_back(tmp[i].second);
                i++;
            } 
            ans.push_back(tmp_ans);
        }
        return ans;
    }
};

  官方题解:构建一个$hashmap$,$hashmap$的$key-val$为$(gsize,users)$,$gsize$表示用户组的大小,$users$表示满足用户组大小为$gsize$的所有用户。由于使用的是$hashmap$时间复杂度为$O(N)$,空间复杂度$O(N)$。ac代码如下:

class Solution {
public:
    vector<vector<int>> groupThePeople(vector<int>& groupSizes) {
        unordered_map<int, vector<int>> groups;
        for (int i = 0; i < groupSizes.size(); ++i) {
            groups[groupSizes[i]].push_back(i);
        }

        vector<vector<int>> ans;
        for (auto group = groups.begin(); group != groups.end(); ++group) {
            const int& gsize = group->first;
            vector<int>& users = group->second;
            for (auto iter = users.begin(); iter != users.end(); iter = next(iter, gsize)) {
                vector<int> dummy(iter, next(iter, gsize));
                ans.push_back(dummy);
            }
        }
        return ans;
    }
};
原文地址:https://www.cnblogs.com/z1141000271/p/12848682.html