1. 程式人生 > >【LeetCode】73. Set Matrix Zeroes(C++)

【LeetCode】73. Set Matrix Zeroes(C++)

地址:https://leetcode.com/problems/set-matrix-zeroes/

題目:

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

.
Example 1:
在這裡插入圖片描述

Example 2:
在這裡插入圖片描述
Follow up:

  • A straight forward solution using O ( m n ) O(mn)
    space is probably a bad idea.
  • A simple improvement uses O ( m + n )
    O(m + n)
    space, but still not the best solution.
  • Could you devise a constant space solution?

理解:

就是如果原陣列的某個位置是0,把其所在行列都置為0
straight forward的想法就是用一個新陣列嘍,複雜度是 O ( m n ) O(mn)
這個題麻煩的地方是如果某個元素是0,把行列都置為0會影響後面的判斷,因此可以把需要置0的位置存成一個和所有數都不相同的數,這樣就不會混淆了。但是這樣的時間複雜度很高。

實現1:

O ( m + n ) O(m+n) 的思路就是記錄下應該是0的行和列,最後再賦值一次。
不過這裡用unordered_set好像很慢的樣子,可以用陣列

class Solution {
public:
	void setZeroes(vector<vector<int>>& matrix) {
		unordered_set<int> rs, cs;
		for (int i = 0; i < matrix.size(); ++i) {
			for (int j = 0; j < matrix[0].size(); ++j) {
				if (matrix[i][j] == 0) {
					rs.insert(i);
					cs.insert(j);
				}
			}
		}
		for (auto i : rs) {
			for (int j = 0; j < matrix[0].size(); ++j)
				matrix[i][j] = 0;
		}
		for (auto j : cs) {
			for (int i = 0; i < matrix.size(); ++i)
				matrix[i][j] = 0;
		}
	}
};

實現2:

如果要求空間複雜度為 O ( 1 ) O(1) 的話,可以借第一行和第一列來表示是否應該把該行或者該列置為0。對於matrix[i][j]可以用matrix[0][j]和matrix[i][0]來表示。注意到對於matrix[0][0],兩個位置是重合的,因此需要一個額外的空間來表示。也就是matrix[0][0]表示的是第0行應該置為0,firstCol表示第0列應該置為0。

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        bool firstCol=false;
        int r=matrix.size(),c=matrix[0].size();
        for(int i=0;i<r;++i){
            if(matrix[i][0]==0)
                firstCol=true;
            for(int j=1;j<c;++j){
                if(matrix[i][j]==0){
                    matrix[i][0]=0;
                    matrix[0][j]=0;
                }
            }
        }
        for(int i=1;i<r;++i){
            for(int j=1;j<c;++j){
                if(matrix[i][0]==0||matrix[0][j]==0)
                    matrix[i][j]=0;
            }
        }
        if(matrix[0][0]==0)
            for(int j=1;j<c;++j)
                matrix[0][j]=0;
        if(firstCol)
            for(int i=0;i<r;++i)
                matrix[i][0]=0; 
    }
};