算法系列——Set Matrix Zeroes

来源:互联网 发布:发那科攻丝编程 编辑:程序博客网 时间:2024/05/21 20:29

题目描述

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?

解题思路

解法1:空间复杂度为O(m+n)
需要新增两个一维辅助数组,分别用来记录 需要填充0的行和列。
解法2:空间复杂度为O(1)
利用原数组的第一行 第一列 ,主要保存第一行 第一列的原始状态。

程序实现

空间复杂度为O(m+n)

public class Solution {    public void setZeroes(int[][] matrix) {  if(matrix==null||matrix.length==0)            return;        int m=matrix.length;        int n=matrix[0].length;        int[] row=new int[m];        int[] col=new int[n];        for(int i=0;i<m;i++)            for(int j=0;j<n;j++)                if(matrix[i][j]==0){                    row[i]=1;                    col[j]=1;                }        for(int i=0;i<m;i++)            if(row[i]==1)                for(int j=0;j<n;j++)                    matrix[i][j]=0;        for(int i=0;i<n;i++)            if(col[i]==1)                for(int j=0;j<m;j++)                    matrix[j][i]=0;    }}

空间复杂度为O(1)

public class Solution {    public void setZeroes(int[][] matrix) {         int m = matrix.length;          int n = matrix[0].length;          int i, j;          //先标记第一行和第一列是否有0          boolean firstRow = false, firstCol = false;          for (j = 0; j < n; j++) {              if (0 == matrix[0][j]) {                  firstRow = true;                  break;              }          }          for (i = 0; i < m; i++) {              if (0 == matrix[i][0]) {                  firstCol = true;                  break;              }          }          //从第二行第二列还是遍历,如果遇到0,则把它所在行和列的第一个值设为0             for (i = 1; i < m; i++) {              for (j = 1; j < n; j++) {                  if (0 == matrix[i][j]) {                      matrix[i][0] = 0;                      matrix[0][j] = 0;                  }              }          }          //把第一列的0所在行都设为0,把第一行的0所在列都设为0          for (i = 1; i < m; i++) {              if (0 == matrix[i][0]) {                  for (j = 1; j < n; j++) {                      matrix[i][j] = 0;                  }              }          }          for (j = 1; j < n; j++) {              if (0 == matrix[0][j]) {                  for (i = 1; i < m; i++) {                      matrix[i][j] = 0;                  }              }          }          //根据标记决定第一行和第一列是否全设为0          if (firstRow) {              for (j = 0; j < n; j++) {                  matrix[0][j] = 0;              }          }          if (firstCol) {              for (i = 0; i < m; i++) {                  matrix[i][0] = 0;              }          }    }}
原创粉丝点击