leetcode 1462 课程表

90 阅读1分钟

题目描述

连续轰炸四五天了,天天都是课程表

leetcode.cn/problems/co…

截屏2023-09-12 上午9.35.24.png

解法

一眼定阵,鉴定为邻接矩阵,我的思路是这样的

  1. 初始化一个 numCourses * numCourses 大小的邻接矩阵 和判断是否联通的bool矩阵
  2. 选取入度为0的节点加入队列
  3. pop 队列,根据这个值生成它联通的节点,和它联通节点的字节点,将bool矩阵的对应节点设为true
  4. 其所有子节点的入度 -1
  5. 循环至步骤2

代码


func checkIfPrerequisite(numCourses int, prerequisites [][]int, queries [][]int) []bool {
    var (
       matrix   = make([][]bool, numCourses)  // bool矩阵
       indegree = make([]int, numCourses)    // 邻接矩阵
       q        = make([][]int, numCourses)  // 记录某节点的字节点队列
    )
    for i, _ := range matrix {
       matrix[i] = make([]bool, numCourses)
       q[i] = []int{}   //初始化操作
    }
    for _, v := range prerequisites {
       q[v[0]] = append(q[v[0]], v[1])    // 把v[1]保存在v[0]的字节点队列中
       indegree[v[1]]++                   // v[1]的入度+1
    }
    zeroQ := []int{}                     // 保存入度为0的节点
    for k, v := range indegree {
       if v == 0 {
          zeroQ = append(zeroQ, k)       // 找到所有入度为0的节点
       }
    }
    for len(zeroQ) > 0 {           
       cur := zeroQ[0]
       zeroQ = zeroQ[1:]                // cur 出队
       for _, ne := range q[cur] {      // 遍历cur的字节点
          matrix[cur][ne] = true        // bool矩阵会把 cur 和字节点ne 单向设置为true
          for i := 0; i < numCourses; i++ {
             matrix[i][ne] = matrix[i][ne] || matrix[i][cur]  // 这一步会把cur的父节点和cur的字节点设置为true
          }
          indegree[ne]--                // 入度-1
          if indegree[ne] == 0 {
             zeroQ = append(zeroQ, ne)   //循环前面步骤
          }
       }
    }
    res := []bool{}
    for _, q := range queries {
       res = append(res, matrix[q[0]][q[1]])  // 返回bool矩阵中的结果
    }
    return res
}