一个m*n的矩阵,如果某元素为0,则把它的行和列都设为0
写的比较繁琐,但思路还是很清晰的。:)
package Level3;
/**
* Set Matrix Zeroes
*
* Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
click to show follow up.
Follow up:
Did you use extra space?
A straight forward 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?
*
*/
public class S73 {
public static void main(String[] args) {
int[][] matrix = {{0,0,0,5},
{4,3,1,4},
{0,1,1,4},
{1,2,1,3},
{0,0,1,1}};
setZeroes(matrix);
}
public static void setZeroes(int[][] matrix) {
// 用来标记第一行和第一列是否在一开始就有0的存在
boolean rowZero = false, colZero = false;
for(int i=0; i<matrix.length; i++){
if(matrix[i][0] == 0){
colZero = true;
break;
}
}
for(int j=0; j<matrix[0].length; j++){
if(matrix[0][j] == 0){
rowZero = true;
break;
}
}
// 在矩阵中查找0,标记在行头和列头
for(int i=1; i<matrix.length; i++){
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=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(rowZero){
for(int j=0; j<matrix[0].length; j++){
matrix[0][j] = 0;
}
}
// 处理第一列
if(colZero){
for(int i=0; i<matrix.length; i++){
matrix[i][0] = 0;
}
}
}
}
public class Solution {
public void setZeroes(int[][] matrix) {
int rows = matrix.length;
int cols = matrix[0].length;
boolean rowZero=false, colZero=false; // first row and col
for(int i=0; i<rows; i++){
if(matrix[i][0] == 0){
colZero = true;
}
}
for(int j=0; j<cols; j++){
if(matrix[0][j] == 0){
rowZero = true;
}
}
for(int i=1; i<rows; i++){
for(int j=1; j<cols; j++){
if(matrix[i][j] == 0){
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for(int i=1; i<rows; i++){
if(matrix[i][0] == 0){
for(int j=1; j<cols; j++){
matrix[i][j] = 0;
}
}
}
for(int j=1; j<cols; j++){
if(matrix[0][j] == 0){
for(int i=1; i<rows; i++){
matrix[i][j] = 0;
}
}
}
if(rowZero){
for(int j=0; j<cols; j++){
matrix[0][j] = 0;
}
}
if(colZero){
for(int i=0; i<rows; i++){
matrix[i][0] = 0;
}
}
}
}