• 【Leetcode】【Medium】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.

    解题思路:

    题目乍一看很简单,将矩阵当前为0的位的行列都置为0;

    问题在于:当遇到一个已知0时,不能立刻将其行列置0,因为这样会把原本不是0的位更改,导致继续遍历的时候无法区分哪些是初始0,哪些是后改0;

    有一个解决方法,就是先遍历所有位,记录所有初始为0的行列坐标,遍历一遍之后,再统一做更改;

    但是这个解决方法会占用额外的空间,如何使用o(1)空间完成置0的任务?

    解决方法:

    1、先找到一个初始0位置,并记录它的行oi和列oj;

    2、oi行和oj列最终需要置零,索性将oi这一行和oj这一列当做记录数组;

    3、遍历所有位置,如果遇到0,则将其i和j对应的(oi, j)和(i, oj)置0,这样不会多置0,也做到了标记的作用;

    4、最终遍历oi这一行,将值为0的位置所在列置0;同理遍历oj这一列的元素,将其值为0的位置所在行置0;

    代码:

     1 class Solution {
     2 public:
     3     void setZeroes(vector<vector<int>>& matrix) {
     4         int m = matrix.size();
     5         if (m == 0)
     6             return;
     7         int n = matrix[0].size();
     8         int oi = -1, oj = -1;
     9         for (int i = 0; i < m; ++i) {
    10             for (int j = 0; j < n; ++j) {
    11                 if (matrix[i][j] == 0) {
    12                     oi = i;
    13                     oj = j;
    14                     break;
    15                 }
    16             }
    17             if (oi != -1) break;
    18         }
    19         if (oi == -1) return;
    20         
    21         for (int i = 0; i < m; ++i) {
    22             for (int j = 0; j < n; ++j) {
    23                 if (matrix[i][j] == 0) {
    24                     matrix[oi][j] = 0;
    25                     matrix[i][oj] = 0;
    26                 }
    27             }
    28         }
    29         
    30         for (int i = 0; i < m; ++i) {
    31             if (i != oi && matrix[i][oj] == 0) { // notice
    32                 for (int j = 0; j < n; ++j)
    33                     matrix[i][j] = 0;
    34             }
    35         }
    36         
    37         for (int j = 0; j < n; ++j) {
    38             if (matrix[oi][j] == 0) {
    39                 for (int i = 0; i < m; ++i)
    40                     matrix[i][j] = 0;
    41             }
    42         }
    43         
    44         for (int j = 0; j < n; ++j) 
    45             matrix[oi][j] = 0;
    46         
    47         return;
    48     }
    49 };
  • 相关阅读:
    JavaScript 总结
    Linux脚本shell字符串处理
    linux bash tutorial
    SVG 学习<八> SVG的路径——path(2)贝塞尔曲线命令、光滑贝塞尔曲线命令
    SVG 学习<七> SVG的路径——path(1)直线命令、弧线命令
    SVG 学习<六> SVG的transform
    SVG 学习<五> SVG动画
    SVG 学习<四> 基础API
    SVG 学习<三>渐变
    SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组
  • 原文地址:https://www.cnblogs.com/huxiao-tee/p/4775728.html
Copyright © 2020-2023  润新知