矩阵置零(力扣)思维 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)