考察的知识点:拓扑排序;
解答方法分析:
- 创建一个空的结果列表
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>(); } };