zoukankan      html  css  js  c++  java
  • 73. Set Matrix Zeroes

    Problem statement:

    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?

    Solutions:

    In follow up, O(mn) and O(m+n) is not the best solution, I use O(n+1) space complexitiy to solve the problem.

    First, 

    I set up an bool flat to indicate if current row is selected to reset to 0.

    I set up an bool array to indicate if current col is selected to reset to 0.

    Second, Set up a two-level loop to enumerate all element to pick the row index and col index

    Third, reset all the element to 0.

     1     void setZeroes(vector<vector<int>>& matrix) {
     2         if(matrix.empty()){
     3             return;
     4         }
     5         
     6         bool row_reset = false;
     7         vector<bool> col_reset(matrix[0].size(), false);
     8         
     9         // row index to reset to 0
    10         vector<int> row_idx;
    11         // col index to reset to 0
    12         vector<int> col_idx;   
    13         
    14         for(vector<int>::size_type ix = 0; ix < matrix.size(); ix++){
    15             row_reset = false;
    16             for(vector<int>::size_type iy = 0; iy < matrix[0].size(); iy++){
    17                 if(matrix[ix][iy] == 0){
    18                     // current row is already selected to reset to 0
    19                     if(!row_reset){
    20                         row_idx.push_back(ix);
    21                         // avoid duplicate push back
    22                         row_reset = true;
    23                     }
    24                     // current col is already selected to reset to 0
    25                     if(!col_reset[iy]){
    26                         col_idx.push_back(iy);
    27                         // avoid duplicate push back
    28                         col_reset[iy] = true;
    29                     }
    30                 }
    31             }
    32         }
    33         
    34         // reset selected row to 0
    35         for(vector<int>::size_type ix = 0; ix < row_idx.size(); ix++){
    36             for(vector<int>::size_type iy = 0; iy < matrix[row_idx[ix]].size(); iy++){
    37                 matrix[row_idx[ix]][iy] = 0;
    38             }
    39         }
    40         // reset selected col to 0
    41         for(vector<int>::size_type ix = 0; ix < col_idx.size(); ix++){
    42             for(vector<int>::size_type iy = 0; iy < matrix.size(); iy++){
    43                 matrix[iy][col_idx[ix]] = 0;
    44             }
    45         }
    46         return;
    47     }
  • 相关阅读:
    sql 将某列转换成一个字符串 for xml path用法
    IAsyncResult 接口异步 和 匿名委托
    存储过程和sql语句的优缺点
    ADO.net中常用的对象有哪些?分别描述一下。
    ASP.Net页面生命周期
    请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。
    .net常用的传值的方法
    SQL列合并
    程序员的情书!
    程序员的表达!
  • 原文地址:https://www.cnblogs.com/wdw828/p/6369009.html
Copyright © 2011-2022 走看看