预处理的意思就是在常规的遍历中,先计算某些需要的数据,而不是等到遍历每个点,再去计算一次。
1582. 二进制矩阵中的特殊位置
力扣传送门
思路一:预处理 对于特殊位置,需要保证该点所在的行,所在列的其它位置都是0,相当于行的元素之和、列的元素之和都为1。最容易想到的就是遍历到为1的点,就去判断该点所在的行和列是否符合,但这样对于同一行或者同一列的点,我们就要重复计算好多次。所以我们可以先计算并保存每一行、每一列的元素之和,在遍历判断时就可以直接读取保存的值,预处理使得每一行每一列只需计算一次。
class Solution {
public int numSpecial(int[][] mat) {
int l1=mat.length;
int l2=mat[0].length;
int[] m1=new int[l1];
int[] m2=new int[l2];
for(int i=0;i<l1;i++){
for(int j=0;j<l2;j++){
m1[i]+=mat[i][j];
m2[j]+=mat[i][j];
}
}
int count=0;
for(int i=0;i<l1;i++){
for(int j=0;j<l2;j++){
if(mat[i][j]==1){
if(m1[i]==1 && m2[j]==1){
count++;
}else{
break;
}
}
}
}
return count;
}
}
|