5203. 统计可以提取的工件

226 阅读3分钟

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

每日刷题第63天 2021.03.13

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 ,反之该工件就无法进行挖掘,判断下一个区域范围的工件能否全部暴露进行挖掘。
  • 关键点:
    • 1: 建立出对应的src[1001][1001]的原始矩阵
    • 2: 将对应的挖掘位置的值修改为对应的 src[row][col] = -1
    • 3: 遍历对应的artifacts所有的工件位置进行遍历
    • 4:通过artifacts确定对应的startRow和startCol,endrow和bakCol
    • 5: 对这块区域进行遍历,如果符合条件的工件,利用count进行累加
  • 复杂度分析:
    • 时间复杂度: O(n)
    • 空间复杂度: O(n^2)

AC代码

/**
 * @param {number} n
 * @param {number[][]} artifacts
 * @param {number[][]} dig
 * @return {number}
 */
var digArtifacts = function(n, artifacts, dig) {
  // 优先处理图
  let grap = new Array(n);
  // let visited = new Array(n);
  for(let i = 0; i < n; i++) {
    grap[i] = new Array(n).fill(0);
  }
  let len = dig.length;
  // console.log(grap)
  for(let i = 0; i < len; i++) {
    grap[dig[i][0]][dig[i][1]] = 1;
  }
  // console.log(grap)
  let fact = artifacts;
  let lenF = fact.length;
  let flag = true;
  let ans = 0;
  for(let i = 0; i < lenF; i++) {
    let x1 = fact[i][0];
    let y1 = fact[i][1];
    let x2 = fact[i][2];
    let y2 = fact[i][3];
    for(let j = x1; j <= x2; j++) {
      for(let z = y1; z <= y2; z++) {
        if(grap[j][z] != 1){
          flag = false;
          break;
        }
      }
      if(!flag){
        break;
      }
    }
    if(flag) ans++;
    flag = true;
  }
  return ans;
};

总结

  • 纯模拟的话,还需要多锻炼代码能力,可以转换思路尝试下逆向思维