技术交流可以加:
本人微信:xcg852390212
本人qq:852390212
学习交流qq群1(已满): 962535112
学习交流qq群2: 780902027
矩阵置零
给定一个 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) 的额外空间,但这仍然不是最好的解决方案。
- 你能想出一个常数空间的解决方案吗?
解答
定义两个标记数组row
和col
(类型bool
),如果矩阵第i
行的数字存在0,那么置位row[i]
为true
,如果矩阵第j
列的数字存在0,那么置位col[j]
为true
。然后,遍历矩阵的每一个元素matrix[i][j]
,如果row[i]
和col[j]
中有一个是true
,则置matrix[i][j]
为0。
- 时间复杂度:O(mn)
- 空间复杂度:O(m + n)
C++代码
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int h = matrix.size();
int l = matrix[0].size();
vector<bool> row(h,false),col(l,false);
for(int i=0;i<h;i++)
for(int j=0;j<l;j++)
{
if(matrix[i][j] == 0)
{
row[i] = true;
col[j] = true;
}
}
for(int i=0;i<h;i++)
{
for(int j=0;j<l;j++)
{
if(row[i])
matrix[i][j] = 0;
if(col[j])
matrix[i][j] = 0;
}
}
}
};
Python代码
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
dt_h,dt_l = dict(),dict()
m,n = len(matrix),len(matrix[0])
for i in range(m):
dt_h[i] = False
for i in range(n):
dt_l[i] = False
for i in range(m):
for j in range(n):
if matrix[i][j] == 0:
dt_h[i] = True
dt_l[j] = True
for i in range(m):
for j in range(n):
if dt_h[i] or dt_l[j]:
matrix[i][j] = 0