统计可以提取的工件
难度:
标签:
题目描述
存在一个 n x n
大小、下标从 0 开始的网格,网格中埋着一些工件。给你一个整数 n
和一个下标从 0 开始的二维整数数组 artifacts
,artifacts
描述了矩形工件的位置,其中 artifacts[i] = [r1i, c1i, r2i, c2i]
表示第 i
个工件在子网格中的填埋情况:
(r1i, c1i)
是第i
个工件 左上 单元格的坐标,且(r2i, c2i)
是第i
个工件 右下 单元格的坐标。
你将会挖掘网格中的一些单元格,并清除其中的填埋物。如果单元格中埋着工件的一部分,那么该工件这一部分将会裸露出来。如果一个工件的所有部分都都裸露出来,你就可以提取该工件。
给你一个下标从 0 开始的二维整数数组 dig
,其中 dig[i] = [ri, ci]
表示你将会挖掘单元格 (ri, ci)
,返回你可以提取的工件数目。
生成的测试用例满足:
- 不存在重叠的两个工件。
- 每个工件最多只覆盖
4
个单元格。 dig
中的元素互不相同。
示例 1:

输入:n = 2, artifacts = [[0,0,0,0],[0,1,1,1]], dig = [[0,0],[0,1]] 输出:1 解释: 不同颜色表示不同的工件。挖掘的单元格用 'D' 在网格中进行标记。 有 1 个工件可以提取,即红色工件。 蓝色工件在单元格 (1,1) 的部分尚未裸露出来,所以无法提取该工件。 因此,返回 1 。
示例 2:

输入:n = 2, artifacts = [[0,0,0,0],[0,1,1,1]], dig = [[0,0],[0,1],[1,1]] 输出:2 解释:红色工件和蓝色工件的所有部分都裸露出来(用 'D' 标记),都可以提取。因此,返回 2 。
提示:
1 <= n <= 1000
1 <= artifacts.length, dig.length <= min(n2, 105)
artifacts[i].length == 4
dig[i].length == 2
0 <= r1i, c1i, r2i, c2i, ri, ci <= n - 1
r1i <= r2i
c1i <= c2i
- 不存在重叠的两个工件
- 每个工件 最多 只覆盖
4
个单元格 dig
中的元素互不相同
代码结果
运行时间: 156 ms, 内存: 57.3 MB
// 思路:
// 1. 使用Java Stream API来优化流程。
// 2. 初始化网格并标记已挖掘的点。
// 3. 使用stream和lambda表达式检查每个工件是否可以提取。
import java.util.Set;
import java.util.HashSet;
import java.util.Arrays;
public class ArtifactExtractionStream {
public int countExtractableArtifacts(int n, int[][] artifacts, int[][] dig) {
Set<String> digSet = new HashSet<>();
Arrays.stream(dig).forEach(d -> digSet.add(d[0] + "," + d[1]));
return (int) Arrays.stream(artifacts).filter(artifact -> {
for (int i = artifact[0]; i <= artifact[2]; i++) {
for (int j = artifact[1]; j <= artifact[3]; j++) {
if (!digSet.contains(i + "," + j)) return false;
}
}
return true;
}).count();
}
}
解释
方法:
这个题解首先通过构建一个二维数组 `vis` 来记录所有被挖掘的单元格,其中 `vis[i][j]` 为 1 表示单元格 `(i, j)` 已经被挖掘。接着,对每一个工件,检查其对应的矩形区域内的所有单元格是否都已被挖掘(即检查这些单元格在 `vis` 中的值是否都为 1)。如果一个工件的所有部分都被挖掘了,那么这个工件可以被提取,计数器 `ans` 加一。最后,返回可以提取的工件数量。
时间复杂度:
O(L + A*4)
空间复杂度:
O(n^2)
代码细节讲解
🦆
在题解中,为什么选择使用二维数组`vis`来标记挖掘的单元格,而不是其他数据结构如哈希表?
▷🦆
在实现中,如果`dig`数组中存在重复的挖掘坐标,这会对算法产生什么影响?是否需要对此进行处理?
▷🦆
题解假设不存在重叠的工件,如果这一假设改变,目前的算法需要如何调整以应对可能的重叠?
▷