zoukankan      html  css  js  c++  java
  • [leetcode]73. Set Matrix Zeroes矩阵置0

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

    Example 1:

    Input: 
    [
      [1,1,1],
      [1,0,1],
      [1,1,1]
    ]
    Output: 
    [
      [1,0,1],
      [0,0,0],
      [1,0,1]
    ]

    Example 2:

    Input: 
    [
      [0,1,2,0],
      [3,4,5,2],
      [1,3,1,5]
    ]
    Output: 
    [
      [0,0,0,0],
      [0,4,5,0],
      [0,3,1,0]
    ]

    题意

    给定一个矩阵,只要某个元素为0,就把对应的整行整列都置0。

    思路:

    题目要求O(1) space, 复用第一行第一列作参照。

    若input matrix是:

    1.  先扫第一行,将有0的位置做标记; 再扫第一列,将有0的位置做标记

      

    2. 将第一行第一列作参照,处理matrix剩余部分:扫matrix[i][j], 若为0,则反向去第一行第一列fill 0(做标记)

          

    3. 再扫matrix[i][j], 若之前对应的第一行第一列有fill 0的标记,则 fill myself as 0 

         

           

    4. 最后处理参照物第一行第一列自己

     

    代码

     1 class Solution {
     2     public void setZeroes(int[][] matrix) {
     3         final int rowLen = matrix.length;
     4         final int colLen = matrix[0].length;
     5         boolean row_has_zero = false; // 第一行是否存在 0
     6         boolean col_has_zero = false; // 第一列是否存在 0
     7 
     8         for (int j = 0; j < colLen; j++){
     9             if (matrix[0][j] == 0) {
    10                 row_has_zero = true;
    11                 break;
    12             }
    13         }
    14 
    15         for (int i = 0; i < rowLen; i++){
    16             if (matrix[i][0] == 0) {
    17                 col_has_zero = true;
    18                 break;
    19             }
    20         }
    21 
    22         for (int i = 1; i < rowLen; i++){
    23             for (int j = 1; j < colLen; j++){
    24                 if (matrix[i][j] == 0) {
    25                     matrix[0][j] = 0;
    26                     matrix[i][0] = 0;
    27                 }
    28             }
    29         }
    30 
    31         for (int i = 1; i < rowLen; i++){
    32             for (int j = 1; j < colLen; j++){
    33                 if (matrix[i][0] == 0 || matrix[0][j] == 0){matrix[i][j] = 0;}
    34             }
    35         }
    36         //不能先fill第一行和第一列,因为把第一行第一列当成了参照
    37         if (row_has_zero){
    38             for (int j = 0; j < colLen; j++){
    39                 matrix[0][j] = 0;
    40             }
    41         }
    42         if (col_has_zero){
    43             for (int i = 0; i < rowLen; i++){
    44                 matrix[i][0] = 0;
    45             }
    46         }
    47     }
    48 }
  • 相关阅读:
    Visual C#使用DirectX实现视频播放
    sql server中新增一条数据后返回该数据的ID
    JQuery上传插件Uploadify使用详解
    .NET JS escape加密的后台解密
    Redis Sentinel(哨兵模式)
    Redis集群入门
    Redis 4.0.X版本reshard出现错误的解决办法
    首层nginx 传递 二级代理,三级代理......多级代理nginx 客户端真实IP的方法
    Centos6 Ruby 1.8.7升级至Ruby 2.3.1的方法
    SQL Server 2008示例数据库安装问题解决
  • 原文地址:https://www.cnblogs.com/liuliu5151/p/10953109.html
Copyright © 2011-2022 走看看