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

128 篇文章 0 订阅
16 篇文章 0 订阅

class Solution:
    def removeStones(self, stones: List[List[int]]) -> int:
        if len(stones)==1 or len(stones)==0:
            return 0
        
        #移除的石子数量=图中点个数-极大连通分量数

        #建图也比较有意思,如果他两的横坐标或者纵坐标相同,那么他俩之间就有一条边存在
        n = len(stones)
        edge = collections.defaultdict(list)
        for i, (x1, y1) in enumerate(stones):
            for j, (x2, y2) in enumerate(stones):
                if x1 == x2 or y1 == y2:
                    edge[i].append(j)
        #对图进行DFS遍历,将刚才已经访问过的节点添加到集合中去
        #然后遍历整个节点所连的其余节点,如果不在已经访问过的集合中,那就继续递归访问
        def dfs(x):
            vis.add(x)
            for y in edge[x]:
                if y not in vis:
                    dfs(y)
        
        #设置一个集合,记录访问过的元素
        #遍历图中的每一个点,如果该点不在集合中,那么就加1,然后递归遍历
        vis = set()
        num = 0
        for i in range(n):
            if i not in vis:
                num += 1
                dfs(i)
        
        return n - num

  •  把题目看作是一个图的问题
  •  如果两个点的横坐标或者纵坐标相同的话那么就认为这两个点之间存在边,然后构造出一个图来
  • 然后去遍历整个图,寻找该图的最大连通分量
  • 最终移除的个数=图中点的个数-最大连通分量个数

总结:在处理图的问题中,构图十分重要,有时候根据不同的问题构图的标准也是不一样的。最大连通分量的概念就是如果在添加图中一个点,这个连通分量构成的子图就不连通了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值