生活随笔
收集整理的這篇文章主要介紹了
LeetCode 2050. 并行课程 III(拓扑排序)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
1. 題目
給你一個整數(shù) n ,表示有 n 節(jié)課,課程編號從 1 到 n 。
同時給你一個二維整數(shù)數(shù)組 relations ,其中 relations[j] = [prevCoursej, nextCoursej] ,表示課程 prevCoursej 必須在課程 nextCoursej 之前 完成(先修課的關(guān)系)。
同時給你一個下標(biāo)從 0 開始的整數(shù)數(shù)組 time ,其中 time[i] 表示完成第 (i+1) 門課程需要花費(fèi)的 月份 數(shù)。
請你根據(jù)以下規(guī)則算出完成所有課程所需要的 最少 月份數(shù):
- 如果一門課的所有先修課都已經(jīng)完成,你可以在 任意 時間開始這門課程。
- 你可以 同時 上 任意門課程 。
請你返回完成所有課程所需要的 最少 月份數(shù)。
注意:測試數(shù)據(jù)保證一定可以完成所有課程(也就是先修課的關(guān)系構(gòu)成一個有向無環(huán)圖)。
示例 1:
輸入:n
= 3, relations
= [[1,3],[2,3]], time
= [3,2,5]
輸出:
8
解釋:上圖展示了輸入數(shù)據(jù)所表示的先修關(guān)系圖,以及完成每門課程需要花費(fèi)的時間。
你可以在月份
0 同時開始課程
1 和
2 。
課程
1 花費(fèi)
3 個月,課程
2 花費(fèi)
2 個月。
所以,最早開始課程
3 的時間是月份
3 ,完成所有課程所需時間為
3 + 5 = 8 個月。
示例 2:
輸入:n
= 5, relations
= [[1,5],[2,5],[3,5],[3,4],[4,5]], time
= [1,2,3,4,5]
輸出:
12
解釋:上圖展示了輸入數(shù)據(jù)所表示的先修關(guān)系圖,以及完成每門課程需要花費(fèi)的時間。
你可以在月份
0 同時開始課程
1 ,
2 和
3 。
在月份
1,
2 和
3 分別完成這三門課程。
課程
4 需在課程
3 之后開始,也就是
3 個月后。課程
4 在
3 + 4 = 7 月完成。
課程
5 需在課程
1,
2,
3 和
4 之后開始,也就是在
max(1,2,3,7) = 7 月開始。
所以完成所有課程所需的最少時間為
7 + 5 = 12 個月。提示:
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
所有的先修課程對
[prevCoursej
, nextCoursej
] 都是 互不相同 的。
time
.length
== n
1 <= time
[i
] <= 10^4
先修課程圖是一個有向無環(huán)圖。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/parallel-courses-iii
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
2. 解題
- 拓?fù)渑判?#xff0c;入度為0的時候進(jìn)入隊列
class Solution {
public:int minimumTime(int n
, vector
<vector
<int>>& relations
, vector
<int>& time
) {vector
<vector
<int>> g(n
);vector
<int> indegree(n
), needtime(n
);for (auto& re
: relations
) {g
[re
[0]-1].push_back(re
[1]-1);indegree
[re
[1]-1]++; }queue
<int> q
;int maxtime
= 0;for(int i
= 0; i
< n
; ++i
){if(indegree
[i
]==0){q
.push(i
);needtime
[i
] = time
[i
];maxtime
= max(maxtime
, needtime
[i
]);}}while(!q
.empty()){int id
= q
.front();q
.pop();for(int nid
: g
[id
]){needtime
[nid
] = max(needtime
[nid
], needtime
[id
]+time
[nid
]);maxtime
= max(maxtime
, needtime
[nid
]);if(--indegree
[nid
] == 0)q
.push(nid
);}}return maxtime
;}
};
324 ms 128.5 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關(guān)注我的公眾號(Michael阿明),一起加油、一起學(xué)習(xí)進(jìn)步!
總結(jié)
以上是生活随笔為你收集整理的LeetCode 2050. 并行课程 III(拓扑排序)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。