题解 | #牛群的喂养顺序II#
牛群的喂养顺序II
https://www.nowcoder.com/practice/05abc133293a42358bbbb4016034728e
考察的知识点:拓扑排序;
解答方法分析:
- 创建一个空的结果列表
res和一个辅助变量visited,用于记录已经处理过的元素数量。 - 对
feedOrders进行遍历,统计每个元素的入度,并将入度为0的元素加入结果列表中。 - 使用广度优先搜索的算法来处理剩下的元素。我们可以用一个队列
queue来存储元素,并进行迭代处理。 - 在迭代的过程中,我们首先从队列中取出一个元素
index,然后遍历feedOrders,找到所有以index作为前驱的元素,并将它们的入度减1。如果某个元素的入度减为0,则将其加入队列和结果列表,并将visited加1。 - 最后,我们判断
visited是否等于feedOrders的长度,如果是,则返回结果列表res,否则返回一个空列表。
所用编程语言:C++;
完整编程代码:↓
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numCows int整型
* @param feedOrders int整型vector<vector<>>
* @return int整型vector
*/
vector<int> findFeedOrderII(int numCows, vector<vector<int> >& feedOrders) {
vector<int> feed(numCows, 0);
int visited = 0;
vector<int> res;
queue<int> queue;
vector<vector<int>> lists(numCows);
for (const auto& feeds : feedOrders) {
feed[feeds[0]]++;
lists[feeds[1]].push_back(feeds[0]);
}
for (int i = 0; i < numCows; i++) {
if (feed[i] == 0) {
queue.push(i);
visited++;
res.push_back(i);
}
}
while (!queue.empty()) {
int index = queue.front();
queue.pop();
vector<int>& list = lists[index];
for (int i : list) {
feed[i]--;
if (feed[i] == 0) {
queue.push(i);
res.push_back(i);
visited++;
}
}
}
return visited == numCows ? res : vector<int>();
}
};
查看27道真题和解析

