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