给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
示例 1:
输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
示例 2:
输入:
[
[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(mn) 的额外空间,但这并不是一个好的解决方案。
一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
你能想出一个常数空间的解决方案吗?
空间复杂度 O(1) ;
时间复杂度O(mn) ;
用两个布尔变量就可以解决。
1)、布尔值为了记录首行和首列是否要置为全0;
2)、方法就是利用数组的首行和首列来记录 0 值。
从数组下标的 A[1][1] 开始遍历,
3)、首先按照首行首列中的0,将 其他对应的行和列置为0;
4)、根据布尔值然后处理首行首列。
class Solution {
public void setZeroes(int[][] matrix) {
boolean rowFlag = false;
//判断首行
for (int i = 0; i < matrix[0].length; i++) {
if (matrix[0][i] == 0) {
rowFlag = true;
break;
}
}
boolean colFlag = false;
for (int i = 0; i < matrix.length; i++) {
if (matrix[i][0] == 0) {
colFlag = true;
break;
}
}
for (int i = 1; i < matrix.length; i++) {
for (int j = 1; j < matrix[0].length; j++) {
if (matrix[i][j] == 0){
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for (int i = 1; i < matrix[0].length; i++) {
if (matrix[0][i] == 0) {
for (int j = 0; j < matrix.length; j++) {
matrix[j][i] = 0;
}
}
}
for (int i = 1; i < matrix.length; i++) {
if (matrix[i][0] == 0) {
for (int j = 0; j < matrix[0].length; j++) {
matrix[i][j] = 0;
}
}
}
if (rowFlag){
for (int i = 0; i < matrix[0].length; i++) {
matrix[0][i] = 0;
}
}
if (colFlag){
for (int i = 0; i < matrix.length; i++) {
matrix[i][0] = 0;
}
}
}
}
空间复杂度 O(m+n) ;
时间复杂度O(mn) ;
1)、使用一个行的数组记录那些行内有0值;
2)、使用一个列的数组记录那些行内有0值;
3)、根据行和列的信息来将相应的行和列置为0;
void setZeroes(vector<vector<int>>& matrix) {
int i , j ;
int m = matrix.size() ;
if (m == 0)
return ;
int n = matrix[0].size() ;
vector<int> lineV(n , 0) ;
set<int> mapLine, mapQue ;//记录行和列包含0的信息
for (i = 0 ; i < m ; i ++)
{
for (j = 0 ; j < n ; j ++)
{
if (matrix[i][j] == 0){
mapQue.insert(j) ;
mapLine.insert(i) ;
}
}
}
//根据行和列数组来置包含0的行和列全为0。
for(int li : mapLine)
{
matrix.erase(matrix.begin() + li);
matrix.insert(matrix.begin() + li, lineV ) ;
}
for(int qu : mapQue)
{
for (i = 0 ; i < m ; i ++)
matrix[i][qu] = 0 ;
}
}