【Leetcode】5203. 统计可以提取的工件

题目链接:统计可以提取的工作

题目描述:

存在一个 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;
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值