[LeetCode] Course schedule II
2017-11-12 20:54
507 查看
题目
分析
其实这题是不准备做的,但是由于其中考试有一题和这个很像,那题有点问题,所以就做一个类似的来看看自己是不是真的有什么没考虑到的。这题是一个很明显的拓扑排序,我用的是BFS实现。这题的思路很明显,就是不断地找到入度为0的,并且将它指向的节点的入度都减一,知道最后没有点的入度为0。但是要注意的就是边的指向问题。另外,还有一个特例,就是如果图中有环,之间返回一个空的vector,而不是已经排序的部分。时间复杂度分析
时间复杂度是O(V+E),需要遍历所有点和边代码
class Solution { public: struct vex { int index; int indegree; vector<int> to; vex(int _index, int _indegree = 0) : index(_index), indegree(_indegree) {} }; vector<int> findOrder(int n, vector<pair<int, int> > &edges) { vector<int> ans; queue<int> q; vector<vex> vertex; if (n == 0) return ans; for (int i = 0; i < n; i++) { vertex.push_back(vex(i)); } for (int i = 0; i < edges.size(); i++) { (vertex[edges[i].second].to).push_back(edges[i].first); (vertex[edges[i].first].indegree)++; } for (int 9c2f i = 0; i < n; i++) { if (vertex[i].indegree == 0) q.push(i); } int index, pos; while (!q.empty()) { index = q.front(); q.pop(); ans.push_back(index); for (int i = 0; i < (vertex[index].to).size(); i++) { pos = (vertex[index].to)[i]; if (--(vertex[pos].indegree) == 0) q.push(pos); } } for (int i = 0; i < n; i++) { if (vertex[i].indegree >0) return vector<int>(); } return ans; } };
相关文章推荐
- LeetCode Course Schedule II
- Leetcode(207)Course Schedule (210)Course Schedule II
- LeetCode-Course Schedule II
- [LeetCode]Course Schedule II
- #leetcode#Course Schedule II
- leetcode:Course Schedule II
- [LeetCode]Course Schedule II
- [LeetCode#210]Course Schedule II
- leetcode210——Course Schedule II
- Leetcode 210 Course Schedule II 拓扑排序
- LeetCode 210 - Course Schedule II
- [leetcode]Course Schedule II
- leetcode 210: Course Schedule II
- LeetCode -- Course Schedule II
- LeetCode 210 - Course Schedule II
- LeetCode Course Schedule II
- LeetCode Course Schedule II
- leetcode -- Course Schedule I && II -- TopSort重点
- Leetcode 210 Course Schedule II
- Leetcode170: Course Schedule II