leetcode 2201. 统计可以提取的工件

112 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

leetcode 2201. 统计可以提取的工件

存在一个 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 中的元素互不相同

题目分析

根据题意我们需要再n*n的网格中找出工件,题目中给出的dig数组中存放着我们需要挖掘的坐标。artifacts中存放了工件存放的地方。这边我们需要注意的是工件是可以横跨多个坐标的。

比如说[0,1,1,1]这代表工件在[0,1]中有一部分,在[1,1]中也有一部分。

分步实现

首先根据n构建n*n网格

let arr = new Array(n).fill().map(() => new Array(n).fill(0))

通过循环将dig中我们要挖掘的地方标记为1

let arr = new Array(n).fill().map(() => new Array(n).fill(0))

for(let d of dig) {
    arr[d[0]][d[1]] = 1
  }

遍历artifacts数据,找到工件存放的坐标。将坐标组遍历一半也就是从x1-x2,将y1-y2。结合arr数组判断此位置我们挖不挖如果不挖的话就说明我们找不到此工件,挖的话就继续遍历。这样我们就能通过filter找出能挖到的工件的数量。

let fil = artifacts.filter(pos=>{
      let [r1, c1, r2, c2] = pos
      for(let i=r1; i<=r2; i++){
          for(let j=c1; j<=c2; j++){
              if(!arr[i][j]){
                  return 0
              }
          }
      }
      return 1
  })

代码实现

/**
 * @param {number} n
 * @param {number[][]} artifacts
 * @param {number[][]} dig
 * @return {number}
 */
 var digArtifacts = function(n, artifacts, dig) {
  let arr = new Array(n).fill().map(() => new Array(n).fill(0))
  for(let d of dig) {
    arr[d[0]][d[1]] = 1
  }
  let fil = artifacts.filter(pos=>{
      let [r1, c1, r2, c2] = pos
      for(let i=r1; i<=r2; i++){
          for(let j=c1; j<=c2; j++){
              if(!arr[i][j]){
                  return 0
              }
          }
      }
      return 1
  })
  return fil.length
};