矩阵置零
题目描述:
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
进阶:
一个直观的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
你能想出一个仅使用常量空间的解决方案吗?
示例 1:
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]
示例 2:
输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
思路:这道题难点在于O(1)的空间复杂度。先判断首行首列是否存在0(使用两个变量),然后从(1,1)到(m-1,n-1)进行遍历,将碰到的0对应的首行首列标记为0。在根据首行首列的0,将首行的0对应列置0,首列类似。最后根据两个变量的值,判断是否需要将首行首列置0。
代码:
class Solution {
public void setZeroes(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
int flag = 0 ,flag2=0;
/*
1.判断首行有无0
2.判断首列有无0
3.从(1,1)遍历到(m-1,n-1)
matrix[i][j] 如果为0 则将matrix[i][0] matrix[0][j] 标记为0
4.判断首行的0 将其对应的一列变为0
5.判断首列的0,将其对应的一行变为0
6.判断最初的首行、首列有无0
*/
//1.判断首行有无0
for(int j=1 ;j<n;j++){
if(matrix[0][j] == 0) flag=1;
}
//2.判断首列有无0
for(int i=1;i<m;i++){
if(matrix[i][0] == 0) flag2=1;
}
if(matrix[0][0] == 0 ) {
flag2=1;flag=1;
}
//从(1,1)遍历到(m-1,n-1)
//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][j] == 0) {
matrix[i][0]=0;
matrix[0][j]=0;
}
}
}
//4.判断首行的0 将其对应的一列变为0
for(int j=1 ;j<n;j++){
if(matrix[0][j] == 0) {
for(int i=1;i<m;i++){
matrix[i][j]=0;
}
}
}
//5.判断首列的0,将其对应的一行变为0
for(int i=1;i<m;i++){
if(matrix[i][0] == 0) {
for(int j=1;j<n;j++){
matrix[i][j]=0;
}
}
}
//6.判断最初的首行、首列有无0
if(flag == 1){
for(int j= 0;j<n;j++) matrix[0][j]=0;
}
if(flag2 == 1){
for(int i= 0;i<m;i++) matrix[i][0]=0;
}
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/set-matrix-zeroes