1462. 课程表 IV

思路1 floyd

https://leetcode.cn/problems/course-schedule-iv/solution/1462-cji-hu-shuang-bai-de-yu-ji-suan-jie-a1kk/

使用floyd算法,逐个选取中间点k去"连接"每一对i和j。时间复杂度 O ( n 3 ) O(n^3) O(n3)

需要注意:

  • 初始化二维数组时,用列表生成式法能又快又正确地生成。
  • floyd公式的背诵不复杂,用每个节点当做伸缩点即可。
class Solution:
    def checkIfPrerequisite(self, numCourses: int, prerequisites: List[List[int]], queries: List[List[int]]) -> List[
        bool]:
        connected = [[0 for i in range(numCourses)] for j in range(numCourses)]
        for pairs in prerequisites:
            connected[pairs[0]][pairs[1]] = True

        for k in range(numCourses):
            for i in range(numCourses):
                for j in range(numCourses):
                    # 使用伸缩点k连接ij
                    if connected[i][j]:
                        continue
                    if connected[i][k] and connected[k][j]:
                        connected[i][j] = True

        res = []
        for start, end in queries:
            if connected[start][end] :
                res.append(True)
            else:
                res.append(False)
        return res

思路2 dfs+cache

如负雪明烛 1462. Course Schedule IV 课程表 IV所说,可以用dfs+cache的方式。由于下方的题设条件,时间复杂度大概100^3,而用floyd方法时,复杂度为 O ( n 3 ) O(n^3) O(n3),所以当prerequisites较短时,用思路2更快。

  • 2 <= numCourses <= 100
  • 0 <= prerequisites.length <= (numCourses * (numCourses - 1) / 2)

你可能感兴趣的:(数据结构与算法,leetcode,算法,职场和发展)