文章目录
-
-
- [1. 题目链接](#1. 题目链接)
- [2. 题目大意](#2. 题目大意)
- [3. 示例](#3. 示例)
- [4. 解题思路](#4. 解题思路)
- [5. 参考代码](#5. 参考代码)
-
1. 题目链接
2. 题目大意
描述:给定一个 m×n 大小的矩阵 matrix。
要求:如果一个元素为 0,则将其所在行和列所有元素都置为 0。
说明:
- 请使用「原地」算法。
- m==matrix.length。
- n==matrix[0].length。
- 1≤m,n≤200。
- −231≤matrix[i][j]≤231−1。
进阶:
- 一个直观的解决方案是使用 O(m×n) 的额外空间,但这并不是一个好的解决方案。
- 一个简单的改进方案是使用 O(m+n) 的额外空间,但这仍然不是最好的解决方案。
- 你能想出一个仅使用常量空间的解决方案吗?
3. 示例
java
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]
java
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]
4. 解题思路
- 设定两个变量 flag‾row0、flag‾col0 来标记第一行、第一列是否出现了 0。
- 接下来我们使用数组第一行、第一列来标记 0 的情况。
- 对数组除第一行、第一列之外的每个元素进行遍历,如果某个元素出现 0 了,
则使用数组的第一行、第一列对应位置来存储 0 的标记。 - 再对数组除第一行、第一列之外的每个元素进行遍历,通过对第一行、第一列的标记 0 情况,进行置为 0 的操作。
- 最后再根据 flag‾row0、flag‾col0 的标记情况,对第一行、第一列进行置为 0 的操作。
5. 参考代码
java
class Solution {
public void setZeroes(int[][] matrix) {
int m=matrix.length;
int n=matrix[0].length;
boolean flagRow=false;
boolean flagCol=false;
for(int i=0; i<m; i++){
if(matrix[i][0] == 0){
flagCol=true;
}
}
for(int j=0; j<n; j++){
if(matrix[0][j] == 0){
flagRow=true;
}
}
for(int i=1; i<m; i++){
for(int j=1; j<n; j++){
if(matrix[i][j] == 0){
matrix[i][0]=matrix[0][j]=0;
}
}
}
for(int i=1; i<m; i++){
for(int j=1; j<n; j++){
if(matrix[i][0]==0 || matrix[0][j]==0){
matrix[i][j]=0;
}
}
}
if(flagRow){
for(int j=0; j<n; j++){
matrix[0][j]=0;
}
}
if(flagCol){
for(int i=0; i<m; i++){
matrix[i][0]=0;
}
}
}
}