ID 범위가 0에서 n - 1인 n명의 사람이 있고 각 사람이 정확히 한 그룹에 속한다고 가정합니다. 길이가 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
- 주어진 배열 a – 1의 크기 범위 0에서 i의 경우
- m[g[i]]에 i 삽입
- res라는 행렬 하나 만들기
- 맵 m
- 의 각 요소 i에 대해
- i
- 에 있는 목록의 크기까지 범위 0의 j에 대해
- i 배열의 j번째 요소를 temp에 삽입
- temp 크기 =i
- 키인 경우
- temp를 res에 새 행으로 삽입
- 임시 배열 지우기
- i
- 반환 결과
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예
#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, ],]