LeetCode 73. Set Matrix Zeroes

来源:互联网 发布:dts播放器 for mac 编辑:程序博客网 时间:2024/06/01 08:13

Description

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?

Analysis

题意是对任何含0元素的行或列整体置0。
本身是一道简单的题,Follow up中提到了很容易想到的两种思路:

  • O(mn):存一份矩阵的副本,然后遍历该副本(因为题目中函数参数传递的是引用,所以直接该原矩阵比较方便),碰到0元素就将原矩阵中的对应行列全部置0。
  • O(m+n):开一个bool数组,元素共m+n个,存储第m行(或第n列)是否含0,然后根据该数组对原矩阵置0。

但题目要求我们调整到常数的空间复杂度。实际上,O(m+n)的方法提示我们,我们只需要这m+n个bit就可以正确置0该矩阵,那么可以考虑直接将这些信息存入矩阵,为了方便我选取了第0行和第0列。那么思路如下:

  1. 先遍历第0行和第0列,确定其中是否含0,用布尔型变量l0c0记录;
  2. 遍历矩阵剩余元素,若发现0,则在(对应行,0)(0,对应列)处用0记录;
  3. 遍历第0行和第0列,若为0,则将对应行/列全部置0;
  4. 查看l0c0,若含0,则对应对第0行或第0列置0。

Code

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

Appendix

  • Link: https://leetcode.com/problems/set-matrix-zeroes/
  • Run Time: 53ms
0 0