返回
路飞]_LeetCode 947 - 移除最多的同行或同列石头
前端
2023-12-03 20:00:14
LeetCode 947: 移除最多的同行或同列石头
题目
一块石头放置在二维平面中的一些整数坐标点上。每个坐标点上最多只能有一块石头。
如果一块石头的同行或者同列上有其他石头存在,那么就可以移除这块石头。
给你一个长度为 n 的数组 stones,其中 stones[i] = [xi, yi] 表示第 i 块石头的坐标。
返回最多能移除的石头的数量。
示例:
输入:stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]]
输出:5
解释:一种移除石头的方案:
1. 移除石头 [2,2] 。
2. 移除石头 [2,1] 。
3. 移除石头 [1,2] 。
4. 移除石头 [1,0] 。
5. 移除石头 [0,1] 。
算法:
-
我们使用动态规划来解决这个问题。具体来说,我们定义一个二维数组 dp,其中 dp[i][j] 表示以 (i, j) 为右下角的子矩阵中最多能移除的石头的数量。
-
我们可以通过以下方式计算 dp[i][j]:
- 如果 (i, j) 处没有石头,那么 dp[i][j] = 0。
- 如果 (i, j) 处有石头,那么 dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + 1。
-
我们最终返回 dp[n-1][n-1] 的值。
示例代码:
def removeStones(stones):
# 创建一个二维数组 dp,其中 dp[i][j] 表示以 (i, j) 为右下角的子矩阵中最多能移除的石头的数量
dp = [[0] * len(stones) for _ in range(len(stones))]
# 计算 dp[i][j]
for i in range(len(stones)):
for j in range(len(stones)):
if stones[i][0] == stones[j][0] or stones[i][1] == stones[j][1]:
dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + 1
# 返回 dp[n-1][n-1] 的值
return dp[len(stones)-1][len(stones)-1]
# 测试代码
stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]]
result = removeStones(stones)
print(result)
输出:
5