今天下午电面的题目,花了20分钟完成代码,10分钟讲解讨论,可惜面完后发现有一点小bug,希望能过吧。
Given:
1. A graph contains red and blue nodes2. Each node has up between 1 and n neighbors
3. Find the largest connected network of a given color, e.g. red
R1 - B2 - B3 - R5
| | | |
B1 - R2 - R3 - R4
Input:
{ Nodes: [R1, R2, B1, B2, B3, R3, R5, R4], Red: true}
Output:
R2 or R3 or R4 or R5
Input:
{ Nodes: [R1, R2, B1, B2, B3, R3, R5, R4], Red: false}
class Node {
private:
vector<Node> neighbors;
bool color; // true => red, false => blue
vector<Node> largest;
public:
vector<Node> findLargest(vector<Node> nodes, bool color) {
vector<Node> tmp;
unordered_map<Node, bool> visited;
queue<Node> q, q_r;
int num = 0;
int index = 0, max_size = 0;
int size = nodes.size();
if(size == 0) return tmp;
while(num < size) {
int cur;
for(int i=0; i<size; i++) {
if(visited.find(nodes[i]) == visited.end() && nodes[i].color == color) {
cur = i;
break;
}
}
q.push(nodes[cur]); // R4
tmp.clear();
tmp.push_back(nodes[cur]);
visited[nodes[cur]] = true;
num++;
while(!q.empty()) {
for(int i=0; i<q.size(); i++) {
Node n = q.front();
q.pop();
for(int i=0; i < n.neighbors.size(); i++) { //
if(visited.find(n.neighbors[i]) == visited.end()) {
if(n.neighbors[i].color == color) {
q_r.push(n.neighbors[i]);
tmp.push_back(n.neighbors[i]);
}
visited[n.neighbors[i]] = true;
num++;
}
}
}
swap(q, q_r);
}
if(max_size < tmp.size()) {
max_size = tmp.size();
largest = tmp;
}
}
return largest;
}
};