一. 问题描述
给定一个 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(2)。
步骤一:先遍历第一行和第一列,用两个变量空间判断是否有0。
步骤一:遍历矩阵,将矩阵中0的元素都变换成首行和首列中显示。
步骤二:从首行元素开始进行判断(第一列元素除外),如果有0将该列至0。
步骤三:从首列元素开始进行判断(第一行元素除外),如果有0将该行至0。
步骤四:根据步骤一的两个变量将第一行和第一列是否置0。
三. 执行结果
执行用时 :1 ms, 在所有 java 提交中击败了100.00%的用户
内存消耗 :43.1 MB, 在所有 java 提交中击败了97.99%的用户
四. Java代码
class Solution { public void setZeroes(int[][] matrix) { boolean row=false; boolean col=false; for(int i=0;i<matrix.length;i++) { if(matrix[i][0]==0) { col=true; break; } } for(int j=0;j<matrix[0].length;j++) { if(matrix[0][j]==0) { row=true; break; } } //遍历矩阵,进行步骤二,步骤三 for(int i=0;i<matrix.length;i++) for(int j=0;j<matrix[0].length;j++) { if(matrix[i][j]==0){ matrix[0][j]=0; matrix[i][0]=0; } } //步骤四(判断列) for(int i=1;i<matrix.length;i++) { if(matrix[i][0]==0) { for(int j=1;j<matrix[0].length;j++) { matrix[i][j]=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; } } } if(row==true||col==true) { if(row==true) { for(int j=0;j<matrix[0].length;j++) { matrix[0][j]=0; } } if(col==true) { for(int i=0;i<matrix.length;i++) { matrix[i][0]=0; } } } } }