给定一个 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]]
/* * 73. Set Matrix Zeroes * 题意:把含有0的行和列都设成0 * 难度:Medium * 分类:Array * 思路:用第一行和第一列作为标志位。注意赋值的时候从后往前,防止标志位被改变 * 两遍循环,先记录,再置位 * Tips:注意赋值的顺序,防止标志位被改变 * 思路是很简单,但有许多细节 */
public void setZeroes(int[][] matrix) { boolean col0 = false; //因为 matrix[0][0] 只有一个位置,所以用一个变量单独记录 for (int i = 0; i < matrix.length ; i++) { if(matrix[i][0]==0) col0 = true; 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 = matrix.length-1; i >= 0 ; i--) { //从后往前,标志位那一行最后改变 for (int j = matrix[0].length-1; j >= 1 ; j--) { // j>=1 不包含j==0 if( matrix[i][0]==0 || matrix[0][j]==0 ) matrix[i][j] = 0; } if(col0==true) matrix[i][0]=0; //要在for循环后,再把[i][0]改变 } }