题目链接:统计可以提取的工作
题目描述:
存在一个 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)创建一个二维数组map表示每个网格,初始值均为-1
2)遍历数组artifacts,将artifacts[i]对应网格区域的值均赋值为i,表示网格对应工件i,同时统计第i个工件占据的网格个数。
3)遍历数组dig,找到dig[i]对应map中的网格,将该网格对应工件所占据的网格个数减1。
4)最后统计,各个工件占据的网格个数,为0的就是被提取出来的。
代码如下:
var digArtifacts = function(n, artifacts, dig) {
const map=new Array(n).fill(-1).map(()=>new Array(n).fill(-1));
const artLen=artifacts.length;
const arr=new Array(artLen);
const digLen=dig.length;
for(let i=0;i<artLen;i++){
let [x1,y1,x2,y2]=[...artifacts[i]];
for(let j=x1;j<=x2;j++){
for(let k=y1;k<=y2;k++){
map[j][k]=i;
}
}
arr[i]=(x2-x1+1)*(y2-y1+1);
}
for(let i=0;i<digLen;i++){
let temp=map[dig[i][0]][dig[i][1]];
if(temp!=-1)
arr[temp]--;
}
let res=0;
for(let i=0;i<artLen;i++){
if(arr[i]!=0)
res++;
}
return artLen-res;
};