国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【LeetCode】210. 課程表 II——拓撲排序

這篇具有很好參考價值的文章主要介紹了【LeetCode】210. 課程表 II——拓撲排序。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

題目鏈接:210. 課程表 II

題目描述:
現(xiàn)在你總共有 numCourses 門課需要選,記為 0 到 numCourses - 1。給你一個數(shù)組 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在選修課程 ai 前 必須 先選修 bi 。

例如,想要學習課程 0 ,你需要先完成課程 1 ,我們用一個匹配來表示:[0,1] 。
返回你為了學完所有課程所安排的學習順序??赡軙卸鄠€正確的順序,你只要返回 任意一種 就可以了。如果不可能完成所有課程,返回 一個空數(shù)組 。
``
【LeetCode】210. 課程表 II——拓撲排序,Go,LeetCode,leetcode,算法,拓撲排序,golang
數(shù)據(jù)范圍:
【LeetCode】210. 課程表 II——拓撲排序,Go,LeetCode,leetcode,算法,拓撲排序,golang

題解:從題目描述來看,很容易就知道是拓撲排序問題了,問題在于如何存圖,如何解答,存圖方式比較多,鄰接表、鄰接矩陣,解方面:遍歷、搜索、以及隊列都能完成該題的解答,實現(xiàn)方面很多時候還是會依賴一些語言特性,比如java、c++中有隊列,可以將度為0的點放進隊列中,每次出隊一個去邊,而在golang中數(shù)據(jù)結(jié)構(gòu)支持相對匱乏,因此可以采用遍歷或者搜索方式完成。

本次采用遍歷方式,首先記錄每個節(jié)點的入度,以及邊的關系,遍歷節(jié)點,每次選出一個度為0且未被選過的節(jié)點,然后去掉與這個節(jié)點相連的邊,一共會執(zhí)行numCourses次操作,當操作完后發(fā)現(xiàn)記錄的答案中沒有numCourses個節(jié)點,那么表示不能完成拓撲排序動作。

直接遍歷:

func findOrder(numCourses int, prerequisites [][]int) []int {
	edges := make([][]int, numCourses, numCourses) // 存儲邊的關系
	for i := range edges {
		edges[i] = make([]int, numCourses, numCourses)
	}
	in := make([]int, numCourses, numCourses) // 記錄入度
	for i := 0; i < len(prerequisites); i++ {
		a := prerequisites[i][0]
		b := prerequisites[i][1]
		edges[b][a] = 1 // 表示a指向b的邊
		in[a]++
	}

	res := make([]int, 0, numCourses)
	// 遍歷入度為0的點,然后去掉這些點相連的邊
	for i := 0; i < numCourses; i++ { //共numCourses次操作,
		k := 0 // 記錄當前尋找的入度為0的點
		for j := 0; j < numCourses; j++ { // 找一個度為0且未被遍歷過的點
			if in[j] == 0 {
				res = append(res, j)
				in[j] = -1 // 記得標記為-1,已經(jīng)找過的路徑不再往下尋找
				k = j
				break
			}
		}
		for j := 0; j < numCourses; j++ {
			if edges[k][j] == 1 {
				edges[k][j] = -1 // 斷開這條邊
				in[j]-- //j點的入度-1
			}
		}
	}
	if len(res) != numCourses {
		return []int{}
	}

	return res
}

上述方式采用鄰接矩陣方式來存儲圖,并且通過遍歷方式來計算答案,雖然總共只操作n次,但每次都需要找尋度為0的節(jié)點,斷開與該節(jié)點相連的邊,這樣會有很多次無效的遍歷,浪費時間,因此,我們可以進行進一步的優(yōu)化。

隊列方式:

func findOrder(numCourses int, prerequisites [][]int) []int {
	edges := make([][]int, numCourses, numCourses) // 存儲邊的關系
	for i := range edges {
		edges[i] = make([]int, numCourses, numCourses)
	}
	in := make([]int, numCourses, numCourses) // 記錄入度
	for i := 0; i < len(prerequisites); i++ {
		a := prerequisites[i][0]
		b := prerequisites[i][1]
		edges[b][a] = 1 // 表示a指向b的邊
		in[a]++
	}

	queue := make([]int, 0, numCourses)
	for i := 0; i < numCourses; i++ {
		if in[i] == 0 {
			queue = append(queue, i)
			in[i] = -1
		}
	}

	res := make([]int, 0, numCourses) // 記錄答案
	// 模擬一下隊列
	for len(queue) > 0 {
		cur := queue[0]
		res = append(res, cur)

		queue = queue[1:] // 相當于除去這個元素

		// 從cur這個節(jié)點開始出發(fā),斷邊
		for i := 0; i < numCourses; i++ {
			if edges[cur][i] == 1 { // 如果有邊,則減少入度
				in[i]--
				edges[cur][i] = -1 // 斷開這條邊
				// 如果沒有依賴邊了,加入隊列中
				if in[i] == 0 {
					queue = append(queue, i)
				}
			}
		}
	}

	if len(res) != numCourses {
		return []int{}
	}

	return res
}

當然,前面的存儲我們都采用了鄰接矩陣方式存儲,找邊的時候只能一個個遍歷去尋找,不妨換一種思路,采用鄰接表方式來存儲,優(yōu)化一下代碼:

func findOrder(numCourses int, prerequisites [][]int) []int {
	edges := make([][]int, numCourses) // 存儲邊的關系
	fmt.Println(len(edges))
	in := make([]int, numCourses, numCourses) // 記錄入度
	for i := 0; i < len(prerequisites); i++ {
		u := prerequisites[i][0]
		v := prerequisites[i][1]
		edges[v] = append(edges[v], u) // 記錄v點指向的各個節(jié)點
		in[u]++
	}

	queue := make([]int, 0, numCourses)
	for i := 0; i < numCourses; i++ {
		if in[i] == 0 {
			queue = append(queue, i)
		}
	}

	res := make([]int, 0, numCourses) // 記錄答案
	// 模擬一下隊列
	for len(queue) > 0 {
		cur := queue[0]
		res = append(res, cur)

		queue = queue[1:]

		// 從cur這個節(jié)點開始出發(fā),斷邊
		for _, v := range edges[cur] {
			in[v]--
			if in[v] == 0 {
				queue = append(queue, v)
			}
		}
	}

	if len(res) != numCourses {
		return []int{}
	}

	return res
}

這樣,每個節(jié)點最多入隊一次,也只會遍歷m條邊,假設有n個節(jié)點,那么時間復雜度為O(n+m)文章來源地址http://www.zghlxwxcb.cn/news/detail-706121.html

到了這里,關于【LeetCode】210. 課程表 II——拓撲排序的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 2023-09-10 LeetCode每日一題(課程表 II)

    2023-09-10 LeetCode每日一題(課程表 II)

    點擊跳轉(zhuǎn)到題目位置 現(xiàn)在你總共有 numCourses 門課需要選,記為 0 到 numCourses - 1。給你一個數(shù)組 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在選修課程 ai 前 必須 先選修 bi 。 例如,想要學習課程 0 ,你需要先完成課程 1 ,我們用一個匹配來表示:[0,1] 。 返回你為了學完所

    2024年02月09日
    瀏覽(25)
  • java實現(xiàn)課程表 II

    題目: 現(xiàn)在你總共有? numCourses ?門課需要選,記為? 0 ?到? numCourses - 1 。給你一個數(shù)組? prerequisites ?,其中? prerequisites[i] = [ai, bi] ?,表示在選修課程? ai ?前? 必須 ?先選修? bi ?。 例如,想要學習課程? 0 ?,你需要先完成課程? 1 ?,我們用一個匹配來表示: [0,1] ?。

    2024年02月09日
    瀏覽(17)
  • 想要精通算法和SQL的成長之路 - 課程表II

    想要精通算法和SQL的成長之路 - 課程表II

    想要精通算法和SQL的成長之路 - 系列導航 原題鏈接 核心知識: 拓撲排序是專門 應用于有向圖的算法。 BFS 的寫法就叫拓撲排序,核心就是: 讓入度為0的節(jié)點入隊。 拓撲排序的 結(jié)果不唯一。 同時拓撲排序有一個重要的功能: 能夠檢測有向圖中是否存在環(huán)。 我們先分析一下

    2024年02月09日
    瀏覽(18)
  • leetcode207. 課程表

    你這個學期必須選修 numCourses 門課程,記為 0 到 numCourses - 1 。 在選修某些課程之前需要一些先修課程。 先修課程按數(shù)組 prerequisites 給出,其中 prerequisites[i] = [ai, bi] ,表示如果要學習課程 ai 則 必須 先學習課程 bi 。 例如,先修課程對 [0, 1] 表示:想要學習課程 0 ,你需要先

    2023年04月24日
    瀏覽(21)
  • leetcode 630. 課程表 III

    這里有 n 門不同的在線課程,按從 1 到 n 編號。給你一個數(shù)組 courses ,其中 courses[i] = [durationi, lastDayi] 表示第 i 門課將會 持續(xù) 上 durationi 天課,并且必須在不晚于 lastDayi 的時候完成。 你的學期從第 1 天開始。且不能同時修讀兩門及兩門以上的課程。 返回你最多可以修讀的課

    2024年02月16日
    瀏覽(13)
  • 【圖論】Leetcode 207. 課程表【中等】

    你這個學期必須選修 numCourses 門課程,記為 0 到 numCourses - 1 。 在選修某些課程之前需要一些先修課程。 先修課程按數(shù)組 prerequisites 給出,其中 prerequisites[i] = [ai, bi] ,表示如果要學習課程 ai 則 必須 先學習課程 bi 。 例如,先修課程對 [0, 1] 表示:想要學習課程 0 ,你需要先

    2024年04月14日
    瀏覽(26)
  • LeetCode 0630.課程表 III:貪心 + 優(yōu)先隊列

    力扣題目鏈接:https://leetcode.cn/problems/course-schedule-iii/ 這里有 n 門不同的在線課程,按從 1 到 n ?編號。給你一個數(shù)組 courses ,其中 courses[i] = [duration i , lastDay i ] 表示第 i 門課將會 持續(xù) 上 duration i 天課,并且必須在不晚于 lastDay i 的時候完成。 你的學期從第 1 天開始。且不能

    2024年02月09日
    瀏覽(20)
  • 2023-09-09 LeetCode每日一題(課程表)

    2023-09-09 LeetCode每日一題(課程表)

    點擊跳轉(zhuǎn)到題目位置 你這個學期必須選修 numCourses 門課程,記為 0 到 numCourses - 1 。 在選修某些課程之前需要一些先修課程。 先修課程按數(shù)組 prerequisites 給出,其中 prerequisites[i] = [ai, bi] ,表示如果要學習課程 ai 則 必須 先學習課程 bi 。 例如,先修課程對 [0, 1] 表示:想要學

    2024年02月09日
    瀏覽(20)
  • 2023-09-11 LeetCode每日一題(課程表 III)

    2023-09-11 LeetCode每日一題(課程表 III)

    點擊跳轉(zhuǎn)到題目位置 這里有 n 門不同的在線課程,按從 1 到 n 編號。給你一個數(shù)組 courses ,其中 courses[i] = [durationi, lastDayi] 表示第 i 門課將會 持續(xù) 上 durationi 天課,并且必須在不晚于 lastDayi 的時候完成。 你的學期從第 1 天開始。且不能同時修讀兩門及兩門以上的課程。 返

    2024年02月09日
    瀏覽(21)
  • 【LeetCode熱題100】打卡第38天:課程表&實現(xiàn)前綴樹

    【LeetCode熱題100】打卡第38天:課程表&實現(xiàn)前綴樹

    大家好,我是知識汲取者,歡迎來到我的LeetCode熱題100刷題專欄! 精選 100 道力扣(LeetCode)上最熱門的題目,適合初識算法與數(shù)據(jù)結(jié)構(gòu)的新手和想要在短時間內(nèi)高效提升的人,熟練掌握這 100 道題,你就已經(jīng)具備了在代碼世界通行的基本能力。在此專欄中,我們將會涵蓋各種

    2024年02月17日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包