假设有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, ],]