题目描述
给定一个 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(*m**n*) 的额外空间,但这并不是一个好的解决方案。
- 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
- 你能想出一个常数空间的解决方案吗?
常规方法
思路
- 扫描整个矩阵,把为 0 的元素的坐标记录下来,全部存为一个动态数组
- 对动态数组中的每一个坐标值,把对应的整行和整列置为 0
这样处理的速度较慢,因为可能会出现重复处理的情况。
源代码
public void setZeroes (int[][] matrix) {
List<List<Integer>> flag = new ArrayList<List<Integer>>();
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
if (matrix[i][j] == 0) {
flag.add(Arrays.asList(i,j));
}
}
}
for (List<Integer> integers : flag) {
int row = integers.get(0);
int col = integers.get(1);
for (int i = 0; i < matrix.length; i++) {
matrix[i][col] = 0;
for (int j = 0; j < matrix[i].length; j++) {
matrix[row][j] = 0;
}
}
}
}
方法二:常数空间解决方案
思路也比较类似,找到一个为 0 的元素,记录它的横纵坐标,再把相应的行列置零。需要注意的是,当原始矩阵中的 0 元素在第一行或者第一列时,需要用两个辅助变量记录下来,特殊处理一下。
源代码
public void setZeroes(int[][] matrix) {
boolean fr = false,fc = false;
for(int i = 0; i < matrix.length; i++) {
for(int j = 0; j < matrix[0].length; j++) {
if(matrix[i][j] == 0) {
if(i == 0) fr = true;
if(j == 0) fc = true;
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
}
for(int i = 1; i < matrix.length; i++) {
for(int j = 1; j < matrix[0].length; j++) {
if(matrix[i][0] == 0 || matrix[0][j] == 0) {
matrix[i][j] = 0;
}
}
}
if(fr) {
for(int j = 0; j < matrix[0].length; j++) {
matrix[0][j] = 0;
}
}
if(fc) {
for(int i = 0; i < matrix.length; i++) {
matrix[i][0] = 0;
}
}
}
原文地址:https://www.cnblogs.com/yuzhenzero/p/10197706.html
时间: 2024-11-06 07:27:44