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, ],]