zoukankan      html  css  js  c++  java
  • 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.

            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?

     

            思路:要找到矩阵中值为0的元素,并将其所在的行和列中的所有元素都置为0。

            在扫描每一行的过程中,如果边扫描,边置0,则后续扫描每一列的时候,无法区分当前元素是原值为0,还是后置为0的。

            首先想到这种方法,利用长度为n的哈希表,按行扫描,针对每一行中值为0的元素,将其所在的列索引记录到哈希表中,扫描完本行之后,如果该行包含值为0的元素,则将本行所有元素置为0。扫描完所有行之后,根据哈希表中的列索引,将其中每列上所有元素都置为0。

             题目要求空间复杂度为O(1),这稍微增加了一些的难度,上面的那种思路,还需要额外的哈希空间记录列索引。但是,因包含0元素的行最终都会被全置0,本身就是可利用的空间。所以,可以将找到的第一个值为0的元素所在的行,当做缓存空间即可。

            一般情况下,像这种确实需要额外的空间,但有要求空间复杂度为O(1)的,首先就应该想到要利用原有空间。

            代码如下:

    void setZeroes(int** matrix, int matrixRowSize, int matrixColSize) 
    {
        int bufrow = -1;
        int set0flag = 0;
        int i, j;
    
        for(i = 0; i < matrixRowSize; i++)
        {
            for(j = 0; j < matrixColSize; j++)
            {
                if(matrix[i][j] == 0)
                {
                    if(bufrow == -1)
                    {
                        bufrow = i;
                        break;
                    }
                    else
                    {
                        matrix[bufrow][j] = 0;
                        set0flag = 1;
                    }
                }
            }
            
            if(set0flag)
            {
                memset(matrix[i], 0, sizeof(int) * matrixColSize);
                set0flag = 0;
            }
        }
    
        if(bufrow != -1)
        {
            for(j = 0; j < matrixColSize; j++)
            {
                if(matrix[bufrow][j] == 0)
                {
                    for(i = 0; i < matrixRowSize; i++)
                    {
                        matrix[i][j] = 0;
                    }
                }
            }
            memset(matrix[bufrow], 0, sizeof(int) * matrixColSize);
        }   
    }
    


  • 相关阅读:
    飞鸽传书中文源码
    nohup命令参考
    Linux平台编程新手入门 C语言中的移位操作
    小技巧:让linux程序在后台运行
    2440之中断管理
    linux终端中输出彩色字体(C/SHELL)
    C语言标准中的逻辑位移和算术位移
    SQL2005利用ROW_NUMER实现分页的两种常用方式
    不用现有方法,把string转换成int型[C#]
    C# 如何生成一个时间戳
  • 原文地址:https://www.cnblogs.com/gqtcgq/p/7247118.html
Copyright © 2011-2022 走看看