leetcode - 2050. Parallel Courses III

Description

You are given an integer n, which indicates that there are n courses labeled from 1 to n. You are also given a 2D integer array relations where relationsj = prevCoursej, nextCoursej denotes that course prevCoursej has to be completed before course nextCoursej (prerequisite relationship). Furthermore, you are given a 0-indexed integer array time where timei denotes how many months it takes to complete the (i+1)th course.

You must find the minimum number of months needed to complete all the courses following these rules:

You may start taking a course at any time if the prerequisites are met.

Any number of courses can be taken at the same time.

Return the minimum number of months needed to complete all the courses.

Note: The test cases are generated such that it is possible to complete every course (i.e., the graph is a directed acyclic graph).

Example 1:

复制代码
Input: n = 3, relations = [[1,3],[2,3]], time = [3,2,5]
Output: 8
Explanation: The figure above represents the given graph and the time required to complete each course. 
We start course 1 and course 2 simultaneously at month 0.
Course 1 takes 3 months and course 2 takes 2 months to complete respectively.
Thus, the earliest time we can start course 3 is at month 3, and the total time required is 3 + 5 = 8 months.

Example 2:

复制代码
Input: n = 5, relations = [[1,5],[2,5],[3,5],[3,4],[4,5]], time = [1,2,3,4,5]
Output: 12
Explanation: The figure above represents the given graph and the time required to complete each course.
You can start courses 1, 2, and 3 at month 0.
You can complete them after 1, 2, and 3 months respectively.
Course 4 can be taken only after course 3 is completed, i.e., after 3 months. It is completed after 3 + 4 = 7 months.
Course 5 can be taken only after courses 1, 2, 3, and 4 have been completed, i.e., after max(1,2,3,7) = 7 months.
Thus, the minimum time needed to complete all the courses is 7 + 5 = 12 months.

Constraints:

复制代码
1 <= n <= 5 * 10^4
0 <= relations.length <= min(n * (n - 1) / 2, 5 * 10^4)
relations[j].length == 2
1 <= prevCoursej, nextCoursej <= n
prevCoursej != nextCoursej
All the pairs [prevCoursej, nextCoursej] are unique.
time.length == n
1 <= time[i] <= 10^4
The given graph is a directed acyclic graph.

Solution

Topological sort + bfs, keep track of all the parent nodes and children nodes, use a queue to visit all the nodes, make sure the time in queue is the largest time we have at that time.

Time complexity: o ( n ) o(n) o(n)

Space complexity: o ( 1 ) o(1) o(1)

Code

python3 复制代码
class Solution:
    def minimumTime(self, n: int, relations: List[List[int]], time: List[int]) -> int:
        def build_graph(n: int, edges: list):
            graph = {i: {'p': [], 'c': []} for i in range(n)}
            indegree = {i: 0 for i in range(n)}
            for start, end in edges:
                graph[end - 1]['p'].append(start - 1)
                graph[start - 1]['c'].append(end - 1)
                indegree[end - 1] += 1
            return graph, indegree
        
        graph, indegree = build_graph(n, relations)
        time_memo = {i: 0 for i in range(n)}
        queue = collections.deque([])
        for i in range(n):
            if indegree[i] == 0:
                queue.append((i, 0))
        while queue:
            node, finish_time = queue.popleft()
            if time_memo[node] > finish_time + time[node]:
                continue
            time_memo[node] = finish_time + time[node]
            for next_node in graph[node]['c']:
                indegree[next_node] -= 1
                if indegree[next_node] == 0:
                    parent_time = 0
                    for each_parent in graph[next_node]['p']:
                        parent_time = max(parent_time, time_memo[each_parent])
                    queue.append((next_node, parent_time))
        return max(time_memo.values())
相关推荐
不会就选b7 分钟前
算法日常・每日刷题--<优先级队列>2
数据结构·算法
hanlin0313 分钟前
刷题笔记:力扣第189题-轮转数组
笔记·算法·leetcode
琥珀色糖16 分钟前
leetcode hot100题(持续更新)移动零(双指针)
算法·leetcode·职场和发展·双指针·移动零
AndrewHZ1 小时前
【LLM技术全景】RAG 从原理到实战——检索增强生成完整指南
人工智能·深度学习·算法·llm·检索增强·生成式模型·rag
LuminousCPP1 小时前
单链表专题(三)-刷题复盘篇:从快慢指针到环形链表 II 数学推导
数据结构·经验分享·笔记·学习·算法·链表
-dzk-1 小时前
【贪心算法】LC 121.买卖股票的最佳时机
算法·贪心算法
hanlin031 小时前
动态规划专练:力扣第718、1143题
算法·leetcode·动态规划
ChaoZiLL1 小时前
二叉树经典例题
数据结构·算法
不正经学生1 小时前
C语言字符串函数进阶:安全版函数 + 错误处理 + 子串查找
c语言·开发语言·c++·算法·面试
Dr.kangder1 小时前
嵌入式面试总结(十四)——中断处理
单片机·面试·职场和发展·架构·硬件架构·嵌入式