Set Matrix Zeroes leetcode java

矩阵置零算法
本文介绍了一种高效的矩阵置零算法,旨在当矩阵中某个元素为0时,将其所在行和列的所有元素置零。提供了两种解决方案,一种使用额外的空间,另一种则实现了常数空间复杂度。

题目

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?

 

题解

这道题是CC150 1.7上面的原题。可以看上面详尽的解释,我就不写了。

 

代码如下:

 

 1      public  void setZeroes( int[][] matrix) {
 2          int m = matrix.length;
 3          int n = matrix[0].length;
 4         
 5          if(m==0||n==0)
 6              return;
 7          int[] flagr =  new  int[m];
 8          int[] flagc =  new  int[n];
 9         
10          for( int i=0;i<m;i++){
11              for( int j=0;j<n;j++){
12                  if(matrix[i][j]==0){
13                     flagr[i]= 1; 
14                     flagc[j]= 1;
15                 }
16             }
17         }
18         
19          for( int i=0;i<m;i++){
20              for( int j=0;j<n;j++){
21                  if(flagr[i]==1||flagc[j]==1){
22                     matrix[i][j]=0;
23                 }
24             }
25         }
26     }

另一种方法是不需要额外空间的,代码来自discuss:

 1  public  void setZeroes( int[][] matrix) {
 2      int rownum = matrix.length;
 3      if (rownum == 0)   return;
 4      int colnum = matrix[0].length;
 5      if (colnum == 0)   return;
 6 
 7      boolean hasZeroFirstRow =  false, hasZeroFirstColumn =  false;
 8 
 9      //  Does first row have zero?
10       for ( int j = 0; j < colnum; ++j) {
11          if (matrix[0][j] == 0) {
12             hasZeroFirstRow =  true;
13              break;
14         }
15     }
16 
17      //  Does first column have zero?
18       for ( int i = 0; i < rownum; ++i) {
19          if (matrix[i][0] == 0) {
20             hasZeroFirstColumn =  true;
21              break;
22         }
23     }
24 
25      //  find zeroes and store the info in first row and column
26       for ( int i = 1; i < matrix.length; ++i) {
27          for ( int j = 1; j < matrix[0].length; ++j) {
28              if (matrix[i][j] == 0) {
29                 matrix[i][0] = 0;
30                 matrix[0][j] = 0;
31             }
32         }
33     }
34 
35      //  set zeroes except the first row and column
36       for ( int i = 1; i < matrix.length; ++i) {
37          for ( int j = 1; j < matrix[0].length; ++j) {
38              if (matrix[i][0] == 0 || matrix[0][j] == 0)  matrix[i][j] = 0;
39         }
40     }
41 
42      //  set zeroes for first row and column if needed
43       if (hasZeroFirstRow) {
44          for ( int j = 0; j < colnum; ++j) {
45             matrix[0][j] = 0;
46         }
47     }
48      if (hasZeroFirstColumn) {
49          for ( int i = 0; i < rownum; ++i) {
50             matrix[i][0] = 0;
51         }
52     }
53 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值