मान लीजिए n लोग हैं जिनके ID 0 से n-1 की रेंज में हैं और प्रत्येक व्यक्ति ठीक एक समूह से संबंधित है। हमारे पास groupSizes नामक लंबाई n की एक सरणी है। यह सरणी दर्शाती है कि प्रत्येक व्यक्ति किस समूह आकार से संबंधित है, हमें वे समूह ढूंढने हैं जो वहां हैं और प्रत्येक समूह में शामिल लोगों के 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 सरणी को साफ़ करें
- तब
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;
}
};
int 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, ],]