一、题目
给定一个 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]]
提示:
- m == matrix.length
- n == matrix[0].length
- 1 <= m, n <= 200
- -2^31 <= matrix[i][j] <= 2^31 - 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/set-matrix-zeroes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 标记变量
(1)思路
因为各行、列的置零过程会对后续判断造成干扰,因此需先完成全部标记,再进行置零操作。
设计一个变量,标记矩阵的第一列是否需置零,然后用第一列标记各行是否需置零,用第一行标记各列(除第一列外)是否需置零。完成标记后,再依次完成各行、列所需的置零操作。
(2)代码
class Solution {
public void setZeroes(int[][] matrix) {
boolean isZero = false;//标记第一列是否存在0
for (int i = 0; i < matrix.length; i++)
if (matrix[i][0] == 0)
isZero = true;
//标记每一行是否存在0
for (int i = 0; i < matrix.length; i++)
for (int j = 0; j < matrix[0].length; j++)
if (matrix[i][j] == 0) {
matrix[i][0] = 0;
break;
}
//标记每一列是否存在0
for (int j = 1; j < matrix[0].length; j++)
for (int i = 0; i < matrix.length; i++)
if (matrix[i][j] == 0) {
matrix[0][j] = 0;
break;
}
//将除第0列外标记的列置零
for (int j = 1; j < matrix[0].length; j++)
if (matrix[0][j] == 0)
for (int i = 1; i < matrix.length; i++)
matrix[i][j] = 0;
//将标记的行置零
for (int i = 0; i < matrix.length; i++)
if (matrix[i][0] == 0)
for (int j = 1; j < matrix[0].length; j++)
matrix[i][j] = 0;
//将第一列置零
if (isZero == true)
for (int i = 0; i < matrix.length; i++)
matrix[i][0] = 0;
return;
}
}
(3)结果
执行用时 :1 ms,在所有 Java 提交中击败了 99.91% 的用户;
内存消耗 :40.1 MB,在所有 Java 提交中击败了 49.08% 的用户。
三、其他
暂无。