포인트 목록과 숫자 k가 있다고 가정합니다. 점은 데카르트 좌표를 나타내는 (x, y) 형식입니다. 두 점 p1과 p2 사이의 유클리드 거리가 <=k이면 임의의 두 점 p1과 p2를 그룹화할 수 있으므로 분리된 그룹의 총 수를 찾아야 합니다.
따라서 입력이 포인트 =[[2, 2],[3, 3],[4, 4],[11, 11],[12, 12]], k =2인 경우 출력은 다음과 같습니다. 2, ([2,2],[3,3],[4,4]) 및 ([11,11],[12,12])의 두 그룹을 만들 수 있으므로
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
dfs() 함수를 정의합니다. 이 시간이 걸립니다
-
내가 본다면
-
반환
-
본에 i 삽입
-
adj[i]의 각 nb에 대해 수행
-
dfs(nb)
-
기본 방법에서 다음을 수행하십시오-
-
adj :=지도
-
n :=포인트 크기
-
0에서 n 사이의 j에 대해 수행
-
범위 0에서 j에 있는 i에 대해 수행
-
p1 :=포인트[i]
-
p2 :=포인트[j]
-
p1과 p2 사이의 유클리드 거리
-
adj[i]
끝에 j 삽입 -
adj[j]
끝에 i 삽입
-
-
-
-
본 :=새로운 세트
-
답변 :=0
-
0에서 n 사이의 i에 대해 수행
-
내가 본 적이 없다면
-
ans :=ans + 1
-
dfs(i)
-
-
-
반환
-
-
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
from collections import defaultdict class Solution: def solve(self, points, k): adj = defaultdict(list) n = len(points) for j in range(n): for i in range(j): x1, y1 = points[i] x2, y2 = points[j] if (x1 - x2) ** 2 + (y1 - y2) ** 2 <= k ** 2: adj[i].append(j) adj[j].append(i) seen = set() def dfs(i): if i in seen: return seen.add(i) for nb in adj[i]: dfs(nb) ans = 0 for i in range(n): if i not in seen: ans += 1 dfs(i) return ans ob = Solution() points = [ [2, 2], [3, 3], [4, 4], [11, 11], [12, 12] ] k = 2 print(ob.solve(points, k))
입력
[[2, 2],[3, 3],[4, 4],[11, 11],[12, 12]],2
출력
2