Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
每日刷题第63天 2021.03.13
5203. 统计可以提取的工件
- leetcode原题链接:leetcode-cn.com/problems/co…
- 难度:中等
- 方法:
题目描述
- 存在一个 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;
};
总结
- 纯模拟的话,还需要多锻炼代码能力,可以转换思路尝试下逆向思维