zoukankan      html  css  js  c++  java
  • Set Matrix Zeroes -- LeetCode

    原题链接: http://oj.leetcode.com/problems/set-matrix-zeroes/ 
    这是一个矩阵操作的题目,目标非常明白,就是假设矩阵假设有元素为0,就把相应的行和列上面的元素都置为0。这里最大的问题就是我们遇到0的时候不能直接把矩阵的行列在当前矩阵直接置0,否则后面还没訪问到的会被当成原来是0,最后会把非常多不该置0的行列都置0了。
    一个直接的想法是备份一个矩阵,然后在备份矩阵上推断,在原矩阵上置0,这样当然是能够的,只是空间复杂度是O(m*n),不是非常理想。
    上面的方法怎样优化呢?我们看到事实上推断某一项是不是0仅仅要看它相应的行或者列应不应该置0就能够,所以我们能够维护一个行和列的布尔数组,然后扫描一遍矩阵记录那一行或者列是不是应该置0就可以,后面赋值是一个常量时间的推断。这个方案的空间复杂度是O(m+n)。
    事实上还能够再优化,我们考虑使用第一行和第一列来记录上面所说的行和列的置0情况,这里问题是那么第一行和第一列自己怎么办?想要记录它们自己是否要置0,仅仅须要两个变量(一个是第一行,一个是第一列)就能够了。然后就是第一行和第一列,假设要置0,就把它的值赋成0(反正它终于也该是0,不管第一行或者第一列有没有0),否则保留原值。然后依据第一行和第一列的记录对其它元素进行置0。最后再依据前面的两个标记来确定是不是要把第一行和第一列置0就能够了。这种做法仅仅须要两个额外变量,所以空间复杂度是O(1)。
    时间上来说上面三种方法都是一样的,须要进行两次扫描,一次确定行列置0情况,一次对矩阵进行实际的置0操作,所以总的时间复杂度是O(m*n)。代码例如以下: 
    public void setZeroes(int[][] matrix) {
        if(matrix==null || matrix.length==0 || matrix[0].length==0)
            return;
        boolean rowFlag = false;
        boolean colFlag = false;
        for(int i=0;i<matrix.length;i++)
        {
            if(matrix[i][0]==0)
            {
                colFlag = true;
                break;
            }
        }
        for(int i=0;i<matrix[0].length;i++)
        {
            if(matrix[0][i]==0)
            {
                rowFlag = true;
                break;
            }
        }      
        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++)
        {
            for(int j=1;j<matrix[0].length;j++)
            {
                if(matrix[i][0]==0 || matrix[0][j]==0)
                    matrix[i][j] = 0;
            }
        }
        if(colFlag)
        {
            for(int i=0;i<matrix.length;i++)
            {
                matrix[i][0] = 0;
            }
        }
        if(rowFlag)
        {
            for(int i=0;i<matrix[0].length;i++)
            {
                matrix[0][i] = 0;
            }
        }
    }
    这道题也是cc150里面比較经典的题目,看似比較简单,却能够重重优化,终于达到常量空间。事实上面试中面试官看重的是对于算法时间空间复杂度的理解,对优化的概念,这些经常比题目本身的难度更加重要,寻常做题还是要对这些算法分析多考虑哈。
  • 相关阅读:
    python 抓取网页
    Vim XDebug调试PHP php远程调试
    10 条 nmap 技巧
    Linux修改文件及文件夹权限
    mysql 常用命令 汇总
    VS2010打开过多的IntelliTrace.exe进程导致虚拟内存不足的解决办法
    黄聪:MYSQL远程连接失败:ERROR 1130: mysql 1130连接错误的有效解決方法
    黄聪:WordPress搬家更换域名教程
    黄聪:使用 ALinq 实现 Linq to MySQL【转】
    黄聪:Filezilla 二进制上传设定
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4295789.html
Copyright © 2011-2022 走看看