根据C ++所属的小组规模对人员进行分组

假设有n个人,其ID的范围在0到n-1之间,并且每个人都完全属于一个组。我们有长度为n的数组groupSizes。该数组表示每个人所属的组的大小,我们必须找到存在的组以及每个组所包含的人员ID。

假设输入为-[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]]

为了解决这个问题,我们将遵循以下步骤-

  • 创建一张映射

  • 对于0到给定数组a – 1的大小的范围

    • 将我插入m [g [i]]

  • 创建一个称为res的矩阵

  • 对于映射m中的每个元素

    • 将i数组的第j个元素插入temp

    • 如果temp的大小=我的关键

    • 然后将temp插入res作为新行

    • 清除临时数组

    • 对于范围从0到i出现的列表大小的j

    • 返回资源。

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    void print_vector(vector<vector<auto> > v){
       cout << "[";
       for(int i = 0; i<v.size(); i++){
          cout << "[";
          for(int j = 0; j <v[i].size(); j++){
             cout << v[i][j] << ", ";
          }
          cout << "],";
       }
       cout << "]"<<endl;
    }
    class Solution {
       public:
       vector<vector<int>> groupThePeople(vector<int>& g) {
          map <int, vector <int> > m;
          for(int i = 0; i < g.size(); i++){
             m[g[i]].push_back(i);
          }
          vector < vector <int> > res;
          map <int, vector <int> > :: iterator i = m.begin();
          vector <int> temp;
          while(i != m.end()){
             for(int j = 0; j < i->second.size(); j++){
                temp.push_back(i->second[j]);
                if(temp.size() == i->first){
                   res.push_back(temp);
                   temp.clear();
                }
             }
             i++;
          }
          return res;
       }
    };
    main(){
       vector<int> v = {3,3,3,3,3,1,3};
       Solution ob;
       print_vector(ob.groupThePeople(v));
    }

    输入值

    [3,3,3,3,3,1,3]

    输出结果

    [[5, ],[0, 1, 2, ],[3, 4, 6, ],]