0073. Set Matrix Zeroes - kumaeki/LeetCode GitHub Wiki
Given an m x n integer matrix matrix, if an element is 0, set its entire row and column to 0's, and return the matrix.
You must do it in place.
Example 1:
Input: matrix = [[1,1,1],[1,0,1],[1,1,1]]
Output: [[1,0,1],[0,0,0],[1,0,1]]
Example 2:
Input: matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
Output: [[0,0,0,0],[0,4,5,0],[0,3,1,0]]
Constraints:
- m == matrix.length
- n == matrix[0].length
- 1 <= m, n <= 200
- -2^31 <= matrix[i][j] <= 2^31 - 1
Follow up:
A straightforward solution using O(mn) space is probably a bad idea. A simple improvement uses O(m + n) space, but still not the best solution. Could you devise a constant space solution?
乍一看不可能.其实, 只要思想不滑坡, 方法总比问题多.
class Solution {
public void setZeroes(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
boolean flgFirstCol = false, flgFirstRow = false;
// 判断第一列是否有0, 如果有, flg设置为true
for(int i = 0; i < m; i++)
if(matrix[i][0] == 0){
flgFirstCol = true;
break;
}
// 判断第一行是否有0,如果, 那么把最左上角设为0
for(int j = 0; j < n; j++)
if(matrix[0][j] == 0){
flgFirstRow = true;
break;
}
// 从第二行第二列开始遍历二位数组, 如果有0, 那么把该位置对应的行和列的第一个元素设置为0
for(int i = 1; i < m; i++)
for(int j = 1; j < n; j++)
if(matrix[i][j] == 0){
matrix[i][0] = 0;
matrix[0][j] = 0;
}
// 从第二行开始, 如果第一个元素为0, 那么整行设置为0
for(int i = 1; i < m; i++)
if(matrix[i][0] == 0)
matrix[i] = new int[n];
// 从第二列开始, 如果第一个元素为0, 把整列设置为0
for(int j = 1; j < n; j++)
if(matrix[0][j] == 0)
for(int i = 1; i < m; i++)
matrix[i][j] = 0;
// 如果flgFirstRow为真, 那么第一行全部设置为0
if(flgFirstRow)
matrix[0] = new int[n];
// 如果flgFirstCol为真, 那么把第一列全部设置为0
if(flgFirstCol)
for(int i = 0; i < m; i++)
matrix[i][0] = 0;
}
}