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