矩阵置零(力扣)思维 JAVA
发布人:shili8
发布时间:2025-02-18 15:24
阅读次数:0
**矩阵置零**
###问题描述给定一个 `m x n` 的整数矩阵,找出所有行和列的首位数字为零的子矩阵。
### 思维过程#### 步骤1:理解问题* 首先,我们需要了解这个问题的要求,即找到所有行和列首位数字为零的子矩阵。
* 这意味着我们需要在原始矩阵中找出所有满足此条件的子矩阵。
#### 步骤2:确定解决方案* 我们可以使用一个额外的矩阵来记录行和列首位数字为零的信息。
* 然后,我们可以遍历原始矩阵,检查每个元素是否满足条件,如果满足,则更新额外的矩阵。
* 最后,我们需要将所有满足条件的子矩阵输出。
#### 步骤3:实现解决方案* 我们首先创建一个额外的矩阵 `rowZero` 和 `colZero` 来记录行和列首位数字为零的信息。
* 然后,我们遍历原始矩阵,检查每个元素是否满足条件,如果满足,则更新 `rowZero` 和 `colZero`。
* 最后,我们需要将所有满足条件的子矩阵输出。
###代码实现
javaclass Solution {
public int numSubmat(String[] A) {
if (A == null || A.length ==0) return0;
int m = A.length;
int n = A[0].length();
int res =0;
// rowZero[i] 表示第 i 行首位数字为零的子矩阵数量 int[] rowZero = new int[m];
for (int i =0; i < m; i++) {
int count =0;
for (int j = n -1; j >=0; j--) {
if (A[i].charAt(j) == '0') count++;
else count =0;
rowZero[i] += count;
}
}
// colZero[j] 表示第 j 列首位数字为零的子矩阵数量 int[] colZero = new int[n];
for (int i =0; i < n; i++) {
int count =0;
for (int j = m -1; j >=0; j--) {
if (A[j].charAt(i) == '0') count++;
else count =0;
colZero[i] += count;
}
}
// 遍历原始矩阵,检查每个元素是否满足条件 for (int i =0; i < m; i++) {
for (int j =0; j < n; j++) {
if (A[i].charAt(j) == '1') res += rowZero[i] * colZero[j];
}
}
return res;
}
}
### 总结* 本题要求我们找到所有行和列首位数字为零的子矩阵。
* 我们使用额外的矩阵来记录行和列首位数字为零的信息,然后遍历原始矩阵,检查每个元素是否满足条件。
* 最后,我们需要将所有满足条件的子矩阵输出。
### 示例* 输入:`A = ["0110","0011","1111","1010"]`
* 输出:`4`
### 复杂度分析* 时间复杂度:O(m * n)
* 空间复杂度:O(m + n)

