LeetCode547:朋友圈的深度優先解法

梧桐雪發表於2020-10-27

題設

班上有 N 名學生。其中有些人是朋友,有些則不是。他們的友誼具有是傳遞性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那麼我們可以認為 A 也是 C 的朋友。所謂的朋友圈,是指所有朋友的集合。

給定一個 N * N 的矩陣 M,表示班級中學生之間的朋友關係。如果M[i][j] = 1,表示已知第 i 個和 j 個學生互為朋友關係,否則為不知道。你必須輸出所有學生中的已知的朋友圈總數。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/friend-circles
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

思路

逐行遍歷,每一行內部進行深度搜尋(dfs),把遍歷到的內容方法visited集合中,如果逐行遍歷的過程中遍歷到的元素已經visited過了的話,就不需要再深挖了。如果逐行遍歷過程中遇到的元素是沒有visited過的,則恭喜你,找了一個新的朋友圈。

程式碼

class Solution(object):
	def findCircleNum(self, M):
		"""
		:type M: List[List[int]]
		:rtype: int
		"""
		#DFS的三個代表:N,V,R
		N,visited,res = len(M), set(), 0
		#DFS深度優先搜尋,本質上就是遍歷圖,然後把圖中的元素依次放入visited集合中
		def dfs(i):
			for j in range(N):
				if M[i][j] == True and j not in visited:
					visited.add(j)
					dfs(j)
		#接下來遍歷每一行尋找朋友圈個數,如果這一行的元素沒有被visited,那麼繼續深搜,count++
		count = 0
		for i in range(N):
			if i not in visited:
				count += 1
				visited.add(i)
				dfs(i)
		return count

結果

在這裡插入圖片描述

相關文章