?? 算法題 ?? |
?? 算法刷題專欄 | 面試必備算法 | 面試高頻算法 ??
?? 越難的東西,越要努力堅持,因為它具有很高的價值,算法就是這樣?
?? 作者簡介:碩風(fēng)和煒,CSDN-Java領(lǐng)域優(yōu)質(zhì)創(chuàng)作者??,保研|國家獎學(xué)金|高中學(xué)習(xí)JAVA|大學(xué)完善JAVA開發(fā)技術(shù)棧|面試刷題|面經(jīng)八股文|經(jīng)驗分享|好用的網(wǎng)站工具分享??????
?? 恭喜你發(fā)現(xiàn)一枚寶藏博主,趕快收入囊中吧??
?? 人生如棋,我愿為卒,行動雖慢,可誰曾見我后退一步?????
?? 算法題 ?? |
?? 題目鏈接
- 210. 課程表 II
? 題目描述
現(xiàn)在你總共有 numCourses 門課需要選,記為 0 到 numCourses - 1。給你一個數(shù)組 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在選修課程 ai 前 必須 先選修 bi 。
例如,想要學(xué)習(xí)課程 0 ,你需要先完成課程 1 ,我們用一個匹配來表示:[0,1] 。
返回你為了學(xué)完所有課程所安排的學(xué)習(xí)順序??赡軙卸鄠€正確的順序,你只要返回 任意一種 就可以了。如果不可能完成所有課程,返回 一個空數(shù)組 。
示例 1:
輸入:numCourses = 2, prerequisites = [[1,0]]
輸出:[0,1]
解釋:總共有 2 門課程。要學(xué)習(xí)課程 1,你需要先完成課程 0。因此,正確的課程順序為 [0,1] 。
示例 2:
輸入:numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]]
輸出:[0,2,1,3]
解釋:總共有 4 門課程。要學(xué)習(xí)課程 3,你應(yīng)該先完成課程 1 和課程 2。并且課程 1 和課程 2 都應(yīng)該排在課程 0 之后。
因此,一個正確的課程順序是 [0,1,2,3] 。另一個正確的排序是 [0,2,1,3] 。
示例 3:
輸入:numCourses = 1, prerequisites = []
輸出:[0]
提示:
1 <= numCourses <= 2000
0 <= prerequisites.length <= numCourses * (numCourses - 1)
prerequisites[i].length == 2
0 <= ai, bi < numCourses
ai != bi
所有[ai, bi] 互不相同
?? 求解思路&實現(xiàn)代碼&運(yùn)行結(jié)果
? 圖+拓?fù)渑判?/h4>
?? 求解思路
- 首先在求解這道題目之前,可以先來學(xué)習(xí)一下昨天的題目,課程表1,207. 課程表
,博客鏈接地址放到這里了,需要的同學(xué)可以直接跳轉(zhuǎn),課程表1博客地址,這道題目是上一道題目的變種,總體的求解思路是一樣的,只需要求出拓?fù)渑判虻囊环N順序即可。
- 有了基本的思路,接下來我們就來通過代碼來實現(xiàn)一下。
?? 實現(xiàn)代碼
class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
int m=prerequisites.length;
if(numCourses==0||prerequisites==null) return new int[]{};
int[] degree=new int[numCourses];
ArrayList<Integer>[] list=new ArrayList[numCourses];
Arrays.setAll(list,e->new ArrayList<>());
Queue<Integer> queue=new LinkedList<>();
for(int i=0;i<m;i++){
int[] temp=prerequisites[i];
int from=temp[1],to=temp[0];
list[from].add(to);
degree[to]++;
}
for(int i=0;i<numCourses;i++){
if(degree[i]==0){
queue.add(i);
}
}
int[] ans=new int[numCourses];
int cnt=0;
while(!queue.isEmpty()){
int next=queue.poll();
ans[cnt++]=next;
for(int v:list[next]){
if(--degree[v]==0){
queue.add(v);
}
}
}
return cnt==numCourses?ans:new int[]{};
}
}
?? 運(yùn)行結(jié)果
,博客鏈接地址放到這里了,需要的同學(xué)可以直接跳轉(zhuǎn),課程表1博客地址,這道題目是上一道題目的變種,總體的求解思路是一樣的,只需要求出拓?fù)渑判虻囊环N順序即可。
class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
int m=prerequisites.length;
if(numCourses==0||prerequisites==null) return new int[]{};
int[] degree=new int[numCourses];
ArrayList<Integer>[] list=new ArrayList[numCourses];
Arrays.setAll(list,e->new ArrayList<>());
Queue<Integer> queue=new LinkedList<>();
for(int i=0;i<m;i++){
int[] temp=prerequisites[i];
int from=temp[1],to=temp[0];
list[from].add(to);
degree[to]++;
}
for(int i=0;i<numCourses;i++){
if(degree[i]==0){
queue.add(i);
}
}
int[] ans=new int[numCourses];
int cnt=0;
while(!queue.isEmpty()){
int next=queue.poll();
ans[cnt++]=next;
for(int v:list[next]){
if(--degree[v]==0){
queue.add(v);
}
}
}
return cnt==numCourses?ans:new int[]{};
}
}
時間復(fù)雜度&空間復(fù)雜度
?? 共勉
最后,我想和大家分享一句一直激勵我的座右銘,希望可以與大家共勉! |
文章來源:http://www.zghlxwxcb.cn/news/detail-704004.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-704004.html
到了這里,關(guān)于【LeetCode: 210. 課程表 II:拓?fù)渑判?圖】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!