码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode Set Matrix Zeroes

时间:2015-10-11 09:04:06      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

原题链接在这里:https://leetcode.com/problems/set-matrix-zeroes/

最原始的想法就是复制一个matrix, 扫描复制的matrix, 若遇到0, 更改原来的matrix, 如此使用O(m*n) space.

观察到判断一个数是否应该更改为0 只需要看它的同行同列是否有0就好,所以可以优化成只使用两个 boolean array, 一个记录所有行, 一个记录所有列 是否有0即可, 如此使用O(m+n) space.

更好的方法是使用第一行 和 第一列 来代替额上面的两个记录array, 那么第一行和第一列本来是否需要改成0 呢,其实只需要两个boolean value: firstRow, firstCol 来记录就好,如此只需要使用O(1) space.

Time Complexity is always O(m*n).

AC Java:

 1 public class Solution {
 2     public void setZeroes(int[][] matrix) {
 3         if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
 4             return;
 5         }
 6         //Record if first row, first columna contains 0
 7         boolean firstRow = false;
 8         boolean firstCol = false;
 9         for(int i = 0; i<matrix.length; i++){
10             if(matrix[i][0] == 0){
11                 firstCol = true;
12                 break;
13             }
14         }
15         for(int j = 0; j<matrix[0].length; j++){
16             if(matrix[0][j] == 0){
17                 firstRow = true;
18                 break;
19             }
20         }
21         
22         //for the rest of the matrix, if there are 0, mark its corresponding row and columna as 0 at first column and first row
23         for(int i = 1; i<matrix.length; i++){
24             for(int j = 1; j<matrix[0].length;j++){
25                 if(matrix[i][j] == 0){
26                     matrix[i][0] = 0;
27                     matrix[0][j] = 0;
28                 }
29             }
30         }
31         
32         //Scan the matrix for the second time, if corresponding mark is 0, change this element to 0
33         for(int i = 1; i<matrix.length; i++){
34             for(int j = 1; j<matrix[0].length; j++){
35                 if(matrix[i][0] == 0 || matrix[0][j] == 0){
36                     matrix[i][j] = 0;
37                 }
38             }
39         }
40         
41         //Change first row and columna at last
42         if(firstRow){
43             for(int j = 0; j<matrix[0].length; j++){
44                 matrix[0][j] = 0;
45             }
46         }
47         if(firstCol){
48             for(int i = 0; i<matrix.length; i++){
49                 matrix[i][0] = 0;
50             }
51         }
52     }
53 }

 

LeetCode Set Matrix Zeroes

标签:

原文地址:http://www.cnblogs.com/Dylan-Java-NYC/p/4868741.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!