Python程序:将一组点分成k个不同组
假设我们有一组点和一个数字k。这些点以(x, y)的形式表示笛卡尔坐标。如果任意两点p1和p2之间的欧几里德距离<=k,我们可以将它们分组,我们需要找到不相交组的总数。
因此,如果输入类似于 points = [[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作为参数。
如果i在seen中,则
返回
将i插入seen
对adj[i]中的每个nb,执行:
dfs(nb)
在主方法中,执行以下操作:
adj := 一个映射
n := points的大小
对于范围0到n内的j,执行:
对于范围0到j内的i,执行:
p1 := points[i]
p2 := points[j]
如果p1和p2之间的欧几里德距离<k,则
将j插入adj[i]的末尾
将i插入adj[j]的末尾
seen := 一个新的集合
ans := 0
对于范围0到n内的i,执行:
如果i不在seen中,则
ans := ans + 1
dfs(i)
返回ans
让我们看看下面的实现,以便更好地理解:
示例
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
广告