zoukankan      html  css  js  c++  java
  • 【Leetcode】Set Matrix Zeroes

    给定一个m x n的矩阵,如果某个元素为0,则把该元素所在行和列全部置0。

    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

    分析:最直接想到的就是遍历该矩阵,每遇到0就把它所在的行和列全部置0,但这是错的,因为这样会引入新的0到矩阵中。下一个比较容易相到的方法是:遍历矩阵,每遇到一个0元素就把它所在的行和列标记起来,最后再遍历matrix,若某元素的行或者列下标被标记,则置为0,这种方法实现方便,但是其空间复杂度为O(m+n)。如果先按行遍历,当遇到0时,就把该行的所有非0元素置为UINT_MAX;然后按列遍历,若遇到UNIT_MAX的元素就把其置为0,若遇到0元素就把整列置为0,这样就做到了O(1)的空间复杂度。下面把这两种方法的代码都贴上:

    空间复杂度O(m+n)的方法:

    class Solution {
    public:
    	void setZeroes(vector<vector<int> > &matrix) 
    	{
    		int m = matrix.size();
    		if(0 == m) return;
    		int n = matrix[0].size();
    
    		int *rowFlags = new int[m]();
    		int *colFlags = new int[n]();
    
    		for (int i=0; i<m; ++i)
    		{
    			for (int j=0; j<n; ++j)
    			{
    				if (matrix[i][j] == 0)
    				{
    					rowFlags[i] = 1;
    					colFlags[j] = 1;
    				}
    			}
    		}
    
    		for (int i=0; i<m; ++i)
    		{
    			for (int j=0; j<n; ++j)
    			{
    				if (rowFlags[i] || colFlags[j])
    					matrix[i][j] = 0;
    			}
    		}
    
    		delete [] rowFlags;
    		delete [] colFlags;
    	}
    };

    空间复杂度为O(1)的方法:

    class Solution {
    public:
    	void setZeroes(vector<vector<int> > &matrix) 
    	{
    		int m = matrix.size();
    		if(0 == m) return;
    		int n = matrix[0].size();
    
    		// 按行遍历,把包含0的行中的所有非0数用UINT_MAX标记
    		for (int i=0; i<m; ++i)
    		{
    			for (int j=0; j<n; ++j)
    			{
    				if (matrix[i][j] == 0)
    				{
    					for (j=0; j<n; ++j)
    					{
    						if (matrix[i][j] != 0)
    							matrix[i][j] = UINT_MAX;
    					}
    					break;
    				}
    			}
    		}
    
    		// 按列遍历,把包含0的列中的所有数字置为0,并把UINT_MAX的元素置为0
    		for (int i=0; i<n; ++i)
    		{
    			for (int j=0; j<m; ++j)
    			{
    				if (matrix[j][i] == 0)
    				{
    					for (j=0; j<m; ++j)
    						matrix[j][i] = 0;
    					break;
    				}
    
    				if(matrix[j][i] == UINT_MAX)
    					matrix[j][i] = 0;
    			}
    		}
    	}
    };


  • 相关阅读:
    再回首,Java温故知新(八):Java基础之字符串
    《Prism 5.0源码走读》 设计模式
    《Prism 5.0源码走读》Bootstrapper
    VS编译时自动下载NuGet管理的库
    《Prism 5.0源码走读》Prism 5.0简介
    代码阅读
    如何建设个人品牌
    Hexo建站教程
    Codeforce:131A. cAPS lOCK
    一文看懂《最大子序列和问题》
  • 原文地址:https://www.cnblogs.com/pangblog/p/3329068.html
Copyright © 2011-2022 走看看