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]]
为了解决这个问题,我们将遵循以下步骤 -
- 创建一个映射 m
- 对于 i 范围从 0 到给定数组 a 的大小 - 1
- 将 i 插入到 m[g[i]] 中
- 创建一个名为 res 的矩阵
- 对于映射 m 中的每个元素 i
- 对于 j 范围从 0 到 i 处存在的列表的大小
- 将 i 的数组的第 j 个元素插入到 temp 中
- 如果 temp 的大小等于 i 的键
- 然后将 temp 作为新行插入到 res 中
- 清除 temp 数组
- 对于 j 范围从 0 到 i 处存在的列表的大小
- 返回 res。
让我们看看以下实现以更好地理解 -
示例
#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, ],]
广告
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP