LeetCode 947. Most Stones Removed with Same Row or Column 并查集

给定二维平面上的n个石头,每行或每列最多只有一个石头。如果两个石头在同一行或同一列,可以移除一个。任务是找出能移除的最大石头数。例子展示了不同情况下的移除策略和结果。算法通过并查集找到连通组件,从而确定可移除的石头数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 columnas 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.

-----------------------

Connected stones can be reduced to 1 stone,
the maximum stones can be removed = stones number - islands number.
so just count the number of "islands".

from typing import List

class Solution:
    def removeStones(self, stones: List[List[int]]) -> int:
        f = {}
        def find(x):
            if x not in f:
                f[x] = x
                return x
            return f[x] if x == f[x] else find(f[x])
        def union(x,y):
            rx,ry = find(x),find(y)
            f[rx]=f[ry]
        for stone in stones:
            #~的作用是把y=0隐射成-1,y=1映射成-2。所以x>=0,y<0会用这种方式并到一个island里,写成 union(stone[0],'y{}'.format(stone[1])) 也可以
            union(stone[0],~stone[1])
        return len(stones)-len({find(k) for k,v in f.items()})

s = Solution()
print(s.removeStones(stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]]))
print(s.removeStones(stones = [[0,0],[0,2],[1,1],[2,0],[2,2]]))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值