3965. Finish Time of Tasks I
SourceBiweekly Contest 185 Q3DifficultyMediumRating1698
Description
You are given an integer n representing the number of tasks in a project, numbered from 0 to n - 1. These tasks are connected as a tree rooted at task 0. This is represented by a 2D integer array edges of length n - 1, where edges[i] = [ui, vi] indicates that task ui is the parent of task vi.
You are also given an array baseTime of length n, where baseTime[i] represents the time to complete task i.
The finish time of each task is calculated as follows:
- Leaf task: The finish time is
baseTime[i]. - Non-leaf task:
- Let
earliestbe the minimum finish time among its children, andlatestbe the maximum finish time among its children. - Let
ownDurationbe(latest - earliest) + baseTime[i]. - The finish time of task
iislatest + ownDuration.
- Let
Return the finish time of the root task 0.
Example 1:
Input: n = 3, edges = [[0,1],[1,2]], baseTime = [9,5,3]
Output: 17
Explanation:
- Task 2 is a leaf, so its finish time is
baseTime[2] = 3. - Task 1 has one child task 2:
earliest = latest = 3ownDuration = (latest - earliest) + baseTime[1] = 5- Finish time of task 1 is
3 + 5 = 8
- Task 0 has one child with finish time 8:
earliest = latest = 8ownDuration = (latest - earliest) + baseTime[0] = 9- Finish time of task 0 is
8 + 9 = 17
Example 2:
Input: n = 3, edges = [[0,1],[0,2]], baseTime = [4,7,6]
Output: 12
Explanation:
- Task 1 is a leaf, so its finish time is
baseTime[1] = 7. - Task 2 is a leaf, so its finish time is
baseTime[2] = 6. - Task 0 has two children with finish times 7 and 6:
earliest = 6,latest = 7ownDuration = (latest - earliest) + baseTime[0] = (7 - 6) + 4 = 5- Finish time of task 0 is
latest + ownDuration = 7 + 5 = 12
Example 3:
Input: n = 4, edges = [[0,1],[0,2],[2,3]], baseTime = [5,8,2,1]
Output: 18
Explanation:
- Task 1 is a leaf, so its finish time is
baseTime[1] = 8. - Task 3 is a leaf, so its finish time is
baseTime[3] = 1. - Task 2 has one child task 3:
earliest = latest = 1ownDuration = (latest - earliest) + baseTime[2] = 0 + 2 = 2- Finish time of task 2 is
latest + ownDuration = 1 + 2 = 3
- Task 0 has two children with finish times 8 and 3:
earliest = 3,latest = 8ownDuration = (latest - earliest) + baseTime[0] = (8 - 3) + 5 = 10- Finish time of task 0 is
latest + ownDuration = 8 + 10 = 18
Constraints:
1 <= n <= 105edges.length = n - 1edges[i] == [ui, vi]0 <= ui, vi <= n - 1ui != vi- The input is generated such that
edgesrepresents a valid tree. baseTime.length == n1 <= baseTime[i] <= 105- The finish time of every task is guaranteed to be less than
253.
Solutions
Solution 1: DFS
Thinking
The tree is the dependency graph. A node’s finish time needs every child’s finish time, plus its own \(\textit{baseTime}\).
DFS bottom-up: a leaf returns \(\textit{baseTime}[i]\); an internal node takes \(\textit{earliest}\) and \(\textit{latest}\) among children, spends \(\textit{latest}-\textit{earliest}+\textit{baseTime}[i]\), and returns \(\textit{latest}\) plus that duration.
The tree has \(n-1\) edges, so one DFS is the root’s finish time.
First, build the tree from the edge list \(\textit{edges}\) and store each node's children in an adjacency list \(g\).
Then perform DFS starting from the root node \(0\). Define a function \(\textit{dfs}(i)\) that returns the finish time of task \(i\):
- If \(i\) is a leaf node, return \(\textit{baseTime}[i]\) directly;
- Otherwise, recursively compute the finish times of all children, and let \(\textit{earliest}\) and \(\textit{latest}\) be the minimum and maximum among them;
- The own duration of the current task is \(\textit{ownDuration} = (\textit{latest} - \textit{earliest}) + \textit{baseTime}[i]\);
- The finish time of task \(i\) is \(\textit{latest} + \textit{ownDuration}\).
The answer is \(\textit{dfs}(0)\).
The time complexity is \(O(n)\), and the space complexity is \(O(n)\), where \(n\) is the number of nodes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | |
Solution 2: Explicit Stack
Thinking
The tasks form a tree rooted at \(0\). A non-leaf finish time needs the earliest and latest finish times among its children, plus its own \(\textit{baseTime}\). With \(n \le 10^5\), every child must be finished before the current node is computed. Recursing along a chain uses a call depth equal to the node count and overflows Python once the chain reaches length \(1000\). The stack stores \((\textit{node}, \textit{state})\): state \(0\) writes \(\textit{baseTime}[i]\) for a leaf, and otherwise pushes the exit marker and then the children; state \(1\) reads \(\textit{earliest}\) and \(\textit{latest}\), spends \(\textit{latest}-\textit{earliest}+\textit{baseTime}[i]\), and finishes at \(\textit{latest}\) plus that duration. Child order does not change the earliest or latest value.
Build the tree from \(\textit{edges}\) and store each node's children in an adjacency list \(g\). An edge \(u \to v\) means \(u\) is the parent of \(v\).
Starting at the root \(0\), an explicit stack computes every finish time in postorder:
- A leaf's finish time is \(\textit{baseTime}[i]\).
- After every child of a non-leaf is known, let \(\textit{earliest}\) and \(\textit{latest}\) be the minimum and maximum child finish times.
- The task's own duration is \(\textit{ownDuration} = (\textit{latest} - \textit{earliest}) + \textit{baseTime}[i]\).
- The finish time of task \(i\) is \(\textit{latest} + \textit{ownDuration}\).
The answer is the finish time of the root. It is guaranteed to be less than \(2^{53}\).
The time complexity is \(O(n)\), and the space complexity is \(O(n)\), where \(n\) is the number of nodes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |