0
点赞
收藏
分享

微信扫一扫

Golang | Leetcode Golang题解之第68题文本左右对齐

小安子啊 2024-05-05 阅读 7

解题方法

这道题目是典型的拓扑排序问题。我们需要判断是否可以完成所有课程的学习。

在拓扑排序中,首先考虑的是没有任何入边的节点,也就是没有先修课程要求的节点。将这样的节点加入拓扑排序的结果列表后,可以移除该节点的所有出边,减少相邻节点对先修课程的需求。如果某个相邻节点变成了没有任何入边的节点,那么说明这门课可以开始学习了,加入拓扑排序的结果列表。按照这个流程,持续将没有入边的节点加入拓扑排序的结果列表,直到包含所有节点(得到一种拓扑排序),如果不包含所有节点,说明图中存在环,换上的节点不能因为入边为0加入结果列表中。

具体过程如下:

  1. 首先,我们需要建立一个有向图来表示先修课程的关系。使用邻接表的形式存储图,即使用一个二维列表edges,其中edges[i]存储了课程i的后续课程。
  2. 同时,我们需要统计每门课程的入度(即有多少先修课程)。使用一个一维数组deg来记录每门课程的入度。
  3. 接下来,我们需要找到没有任何入边的节点,因为这些课程可以直接学习,没有先修课程的要求。我们将这些节点加入到拓扑排序的结果中,并将与其相邻的节点的入度减少1。
  4. 重复步骤3,直到队列为空。最后,如果拓扑排序的结果包含了所有课程,说明可以完成全部课程的学习;否则,存在环,不可能完成所有课程的学习。

Code

class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        List<List<Integer>> edges = new ArrayList<List<Integer>>();
        for(int i = 0; i < numCourses; i++){
            edges.add(new ArrayList<Integer>());
        }
        int[] deg = new int[numCourses];
        for(int[] e : prerequisites){
            edges.get(e[1]).add(e[0]);
            deg[e[0]]++;
        }
        Queue<Integer> q = new LinkedList<Integer>();
        for(int i = 0; i < numCourses; i++){
            if(deg[i] == 0){
                q.offer(i);
            }
        }
        List<Integer> topo = new ArrayList<Integer>();
        while(!q.isEmpty()){
            int u = q.poll();
            topo.add(u);
            for(int v : edges.get(u)){
                deg[v]--;
                if(deg[v] == 0){
                    q.offer(v);
                }
            }
        }
        return topo.size() == numCourses;
    }
}
举报

相关推荐

0 条评论