zoukankan      html  css  js  c++  java
  • LeetCode(73):矩阵置零

    Medium!

    题目描述:

    给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。

    示例 1:

    输入: 
    [
      [1,1,1],
      [1,0,1],
      [1,1,1]
    ]
    输出: 
    [
      [1,0,1],
      [0,0,0],
      [1,0,1]
    ]
    

    示例 2:

    输入: 
    [
      [0,1,2,0],
      [3,4,5,2],
      [1,3,1,5]
    ]
    输出: 
    [
      [0,0,0,0],
      [0,4,5,0],
      [0,3,1,0]
    ]

    进阶:

    • 一个直接的解决方案是使用  O(mn) 的额外空间,但这并不是一个好的解决方案。
    • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
    • 你能想出一个常数空间的解决方案吗?

    解题思路:

    据说这题是CareerCup上的原题,我还没有刷CareerCup,所以不知道啦,不过这题也不算难。

    这道题中说的空间复杂度为O(mn)的解法自不用多说,直接新建一个和matrix等大小的矩阵,然后一行一行的扫,只要有0,就将新建的矩阵的对应行全赋0,行扫完再扫列,然后把更新完的矩阵赋给matrix即可,这个算法的空间复杂度太高。将其优化到O(m+n)的方法是,用一个长度为m的一维数组记录各行中是否有0,用一个长度为n的一维数组记录各列中是否有0,最后直接更新matrix数组即可。这道题的要求是用O(1)的空间,那么我们就不能新建数组,我们考虑就用原数组的第一行第一列来记录各行各列是否有0。

    - 先扫描第一行第一列,如果有0,则将各自的flag设置为true
    - 然后扫描除去第一行第一列的整个数组,如果有0,则将对应的第一行和第一列的数字赋0
    - 再次遍历除去第一行第一列的整个数组,如果对应的第一行和第一列的数字有一个为0,则将当前值赋0
    - 最后根据第一行第一列的flag来更新第一行第一列

    代码如下:

    C++解法一:

     1 class Solution {
     2 public:
     3     void setZeroes(vector<vector<int> > &matrix) {
     4         if (matrix.empty() || matrix[0].empty()) return;
     5         int m = matrix.size(), n = matrix[0].size();
     6         bool rowZero = false, colZero = false;
     7         for (int i = 0; i < m; ++i) {
     8             if (matrix[i][0] == 0) colZero = true;
     9         }
    10         for (int i = 0; i < n; ++i) {
    11             if (matrix[0][i] == 0) rowZero = true;
    12         } 
    13         for (int i = 1; i < m; ++i) {
    14             for (int j = 1; j < n; ++j) {
    15                 if (matrix[i][j] == 0) {
    16                     matrix[0][j] = 0;
    17                     matrix[i][0] = 0;
    18                 }
    19             }
    20         }
    21         for (int i = 1; i < m; ++i) {
    22             for (int j = 1; j < n; ++j) {
    23                 if (matrix[0][j] == 0 || matrix[i][0] == 0) {
    24                     matrix[i][j] = 0;
    25                 }
    26             }
    27         }
    28         if (rowZero) {
    29             for (int i = 0; i < n; ++i) matrix[0][i] = 0;
    30         }
    31         if (colZero) {
    32             for (int i = 0; i < m; ++i) matrix[i][0] = 0;
    33         }
    34     }
    35 };
  • 相关阅读:
    timer使用方法
    基于开源库jsoncpp的json字符串解析
    jsoncpp构造json字符串和json数组
    通过wifi连接android设备的方法
    Linux 利用管道父子进程间传递数据
    Mac OS X 下部分Android手机无法连接adb问题之解决方案
    android studio 慢的问题
    forever让nodejs后台运行
    js里面如何才能让成员方法去调用类中其他成员
    让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/9154179.html
Copyright © 2011-2022 走看看