[leetcode] 947. Most Stones Removed with Same Row or Column

Description

On a 2D plane, we place n stones at some integer coordinate points. Each coordinate point may have at most one stone.

A stone can be removed if it shares either the same row or the same column as another stone that has not been removed.

Given an array stones of length n where stones[i] = [xi, yi] represents the location of the ith stone, return the largest possible number of stones that can be removed.

Example 1:

Input: stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]]
Output: 5
Explanation: One way to remove 5 stones is as follows:
1. Remove stone [2,2] because it shares the same row as [2,1].
2. Remove stone [2,1] because it shares the same column as [0,1].
3. Remove stone [1,2] because it shares the same row as [1,0].
4. Remove stone [1,0] because it shares the same column as [0,0].
5. Remove stone [0,1] because it shares the same row as [0,0].
Stone [0,0] cannot be removed since it does not share a row/column with another stone still on the plane.

Example 2:

Input: stones = [[0,0],[0,2],[1,1],[2,0],[2,2]]
Output: 3
Explanation: One way to make 3 moves is as follows:
1. Remove stone [2,2] because it shares the same row as [2,0].
2. Remove stone [2,0] because it shares the same column as [0,0].
3. Remove stone [0,2] because it shares the same row as [0,0].
Stones [0,0] and [1,1] cannot be removed since they do not share a row/column with another stone still on the plane.

Example 3:

Input: stones = [[0,0]]
Output: 0
Explanation: [0,0] is the only stone on the plane, so you cannot remove it.

Constraints:

  • 1 <= stones.length <= 1000
  • 0 <= xi, yi <= 104
  • No two stones are at the same coordinate point.

分析

题目的意思是:给定一个二维平面,和n个石头的坐标,同行或者同列的石头可以移除,问最多能够移除的石头的个数。这道题我参考了一下答案的思路,首先要明确的是我们只需要找出连通子图的个数,然后每个连通子图只需要保留一个石头,剩下的全部删除就行了。

  • 首先构建这个无向图,把在同一行或者同一列的石头连接起来
  • 遍历这个图,用visited数组来记录遍历的石头,找出每个连通子图,利用dfs方法,这里用stack记录遍历到的邻居节点,然后就可以求出最终的结果了。

代码

class Solution:
    def removeStones(self, stones: List[List[int]]) -> int:
        graph=collections.defaultdict(list)
        for i,x1 in enumerate(stones):
            for j in range(i):
                x2=stones[j]
                if(x1[0]==x2[0] or x1[1]==x2[1]):
                    graph[i].append(j)
                    graph[j].append(i)
        n=len(stones)
        res=0
        visited=[False]*n
        for i in range(n):
            if(not visited[i]):
                visited[i]=True
                stack=[i]
                cnt=0
                while(stack):
                    cnt+=1
                    node=stack.pop()
                    for nei in graph[node]:
                        if(not visited[nei]):
                            visited[nei]=True
                            stack.append(nei)
                res+=cnt-1
        return res

参考文献

solution

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民小飞侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值