程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [LeetCode從零單刷]Set Matrix Zeroes

[LeetCode從零單刷]Set Matrix Zeroes

編輯:C++入門知識

[LeetCode從零單刷]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 元素。

 

O(mn)空間復雜度的方法很簡單,設置一個 False 初值組成的新矩陣,遍歷全矩陣的元素,發現 0 則行、列全置 trueO(m+n)空間復雜度需要想一想,如果是為了行、列全 0,是不是只要保存單獨行、列的信息就好了?只要多增加一行、一列記錄 bool 值就好了O(1)空間復雜度呢?基本有兩種思路:(1)開辟常數新空間;(2)利用已有空間 如果利用第二種方法,將它用在O(1)空間復雜度,用原矩陣的第1行和第1列的值記錄此行是否為0,就可以了。 但是這樣有一個弊端:修改原矩陣元素,又基於原矩陣判斷,但判斷全部基於原值,需要新變量記錄原值。因此需要第1行和第1列是否是否置為0,需要另外的2個 bool 值來記錄。基本思路是: 2個bool值第1行、第1列是否全0,此時不修改值;【2個新開辟元素=》第1行、第1列】第1行、第1列記錄第2~n行 、 第2~m列是否全0。然後根據記錄修改第2~n行 、 第2~m列元素;【第1行、第1列=》第2~n行 、 第2~m列】根據第1步中bool值,修改特殊的第1行、第1列元素是否全0
class Solution {
public:
    void setZeroes(vector>& matrix) {
        int row = matrix.size();
        int col = matrix[0].size();
        if(row <= 1 && col <= 1)    return;
        
        bool zerorow = false;
        bool zerocol = false;
        for(int i = 0; i < row; i++)
        {
            if(matrix[i][0] == 0)
            {
                zerocol = true;
                break;
            }
        }
        
        for(int i = 0; i < col; i++)
        {
            if(matrix[0][i] == 0)
            {
                zerorow = true;
                break;
            }
        }
        
        for(int i = 1; i < row; i++)
        {
            for(int j = 1; j < col; j++)
            {
                if(matrix[i][j] == 0)
                {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }        
        }
            
        for(int i = 1; i < row; i++)
        {
            if(matrix[i][0] == 0)
            {
                for(int j = 1; j < col; j++)    matrix[i][j] = 0;
            }
        }
        
        for(int i = 1; i < col; i++)
        {
            if(matrix[0][i] == 0)
            {
                for(int j = 1; j < row; j++)    matrix[j][i] = 0;
            }
        }
        
        if(zerorow)
        {
            for(int i = 0; i< col; i++) matrix[0][i] = 0;
        }
        
        if(zerocol)
        {
            for(int i = 0; i< row; i++) matrix[i][0] = 0;
        }
        
        return;
    }
};

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved