947. 移除最多的同行或同列石头

题目描述:n 块石头放置在二维平面中的一些整数坐标点上。每个坐标点上最多只能有一块石头。
如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头。
给你一个长度为 n 的数组 stones ,其中 stones[i] = [xi, yi] 表示第 i 块石头的位置,返回 可以移除的石子 的最大数量。
解题思路:其实这道题的本质是对一个有向图,求连通分量的数量,因为对每一个联通分量我们都可以按照dfs遍历逆序的顺序移除石子,让这个连通分量只剩下一个石子,求联通分量我们可以用并查集来求,因为这里的坐标涉及到两个维度,但并查集的查找单元都是一维的,这里我们按列考元素进行合并,因为最终剩下的元素都在不同行不同列,我们可以一开始就做一个粗略的划分,将同一行的元素放在一个连通域内,用行坐标表示所属的连通域,这要我们只需要考虑每一列的元素,然后将他们所代表的行进行合并即可,代码如下:

class Solution:
    def removeStones(self, stones: List[List[int]]) -> int:
        tabel = {}
        from collections import defaultdict
        G = defaultdict(list)
        for s in stones:
            tabel[s[0]] = s[0]
            G[s[1]].append(s[0])
        def find(x):
            root = x
            while(root != tabel[root]):
                root = tabel[root]
            while(x != root):
                origin_r = tabel[x]
                tabel[x] = root
                x = origin_r
            return root
        for k, v in G.items():
            root = find(v[0])
            for i in v[1:]:
                root_i = find(i)
                if root != root_i:
                    tabel[root_i] = root
        vs = set([find(v) for v in tabel.keys()])
        return len(stones) - len(vs)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值