当前位置:实例文章 » JAVA Web实例» [文章]矩阵置零(力扣)思维 JAVA

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

其他信息

其他资源

Top