16 - Hard - Friend Circles
N * N 의 행렬 M 을 지정 하여 학급 중 학생 간 의 친구 관 계 를 나타 낸다.만약 에 M [i] [j] = 1 은 i 번 째 와 j 번 째 학생 이 서로 친구 가 되 는 것 을 알 고 있 음 을 나타 낸다. 그렇지 않 으 면 모른다.너 는 모든 학생 들 이 이미 알 고 있 는 친구 권 의 총 수 를 출력 해 야 한다.
예시 1:
:
[[1,1,0],
[1,1,0],
[0,0,1]]
: 2
설명: 이미 알 고 있 는 학생 0 과 학생 1 은 서로 친구 이 고 그들 은 한 친구 권 에 있다.두 번 째 학생 은 스스로 친구 권 에 있다.그래서예시 2:
:
[[1,1,0],
[1,1,1],
[0,1,1]]
: 1
설명: 이미 알 고 있 는 학생 0 과 학생 1 은 서로 친구 이 고 학생 1 과 학생 2 는 서로 친구 이기 때문에 학생 0 과 학생 2 도 친구 이기 때문에 그들 세 사람 은 한 친구 권 에서 1 로 돌아간다.주의:
N 은 [1, 200] 범위 내 에 있다.모든 학생 에 게 는 M [i] [i] = 1 이 있 습 니 다.M [i] [j] = 1 이 있 으 면 M [j] [i] = 1 이 있다.
자기가 쓴 것, 귀속, 비교적 느리다, 120 ms
class Solution(object):
def findCircleNum(self, M):
"""
:type M: List[List[int]]
:rtype: int
"""
self.M = M
self.n = len(M)
self.circles = []
self.done = []
for i in range(self.n):
self.travel(i)
return len(self.circles)
def travel(self, i):
if i in self.done: #
return
self.done.append(i) #
alone = True
for j in range(self.n): # i,
if i == j:
continue
if self.M[i][j] == 1: #
alone = False
no_circle = True
for c in self.circles: #
if i in c:
no_circle = False
if j not in c: # , ,
c.append(j)
elif j in c:
no_circle = False
if i not in c:
c.append(i)
if no_circle: # ,
self.circles.append([i, j])
self.travel(j) # !!!! , ,
if alone:
self.circles.append([i])
다른 사람 이 쓴 '44ms' 는 사실 위의 생각 과 같 지만 많이 간편 해 졌 다.
def findCircleNum(self, M):
an = 0
rest = list(range(len(M))) #
circles = [] #
while rest:
stack = [rest.pop(0)] # ,
c = []
while stack: #
cur = stack.pop() #
c.append(cur) #
for x in [x for x in rest if M[cur][x]]: # rest , cur
rest.remove(x) # 2. rest ,
stack.append(x) # 1. ,!!!!!!
circles.append(c) # , ,
an += 1 #
return an
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.