• 《Cracking the Coding Interview》——第1章:数组和字符串——题目7


    2014-03-18 01:55

    题目:给定一个MxN矩阵,如果某个元素为0,则将对应的整行和整列置为0。

    解法:单独挑出一行和一列作为标记数组。因为某元素为0就全部置为0,所以不论A[i][j]为0中的j是几,第i行总会被置为0的。再用O(1)的额外空间去标记单独挑出的那一行一列是否包含0即可。要注意最后清零的顺序和范围不要错了。

    代码:

      1 // 1.7 Write an algorithm such that if an element in an MxN matrx is 0, its antire row and column are set to 0.
      2 #include <cstdio>
      3 #include <vector>
      4 using namespace std;
      5 
      6 class Solution {
      7 public:
      8     void setMatrixZero(vector<vector<int> > &board) {
      9         int m, n;
     10         
     11         m = (int)board.size();
     12         if (m == 0) {
     13             return;
     14         }
     15         n = (int)board[0].size();
     16         if (n == 0) {
     17             return;
     18         }
     19         
     20         int i, j;
     21         bool row0_has_zero = false;
     22         bool col0_has_zero = false;
     23         for (i = 0; i < m; ++i) {
     24             if (board[i][0] == 0) {
     25                 col0_has_zero = true;
     26                 break;
     27             }
     28         }
     29         for (j = 0; j < n; ++j) {
     30             if (board[0][j] == 0) {
     31                 row0_has_zero = true;
     32             }
     33         }
     34         for (i = 1; i < m; ++i) {
     35             for (j = 1; j < n; ++j) {
     36                 if (board[i][j] == 0) {
     37                     board[i][0] = 0;
     38                     board[0][j] = 0;
     39                 }
     40             }
     41         }
     42         for (i = 1; i < m; ++i) {
     43             if (board[i][0] == 0) {
     44                 for (j = 1; j < n; ++j) {
     45                     board[i][j] = 0;
     46                 }
     47             }
     48         }
     49         for (j = 1; j < n; ++j) {
     50             if (board[0][j] == 0) {
     51                 for (i = 1; i < m; ++i) {
     52                     board[i][j] = 0;
     53                 }
     54             }
     55         }
     56         if (row0_has_zero) {
     57             for (j = 0; j < n; ++j) {
     58                 board[0][j] = 0;
     59             }
     60         }
     61         if (col0_has_zero) {
     62             for (i = 0; i < m; ++i) {
     63                 board[i][0] = 0;
     64             }
     65         }
     66     }
     67 };
     68 
     69 int main()
     70 {
     71     vector<vector<int> > board;
     72     int i, j;
     73     int m, n;
     74     Solution sol;
     75     
     76     while (scanf("%d%d", &m, &n) == 2 && (m || n)) {
     77         board.resize(m);
     78         for (i = 0; i < m; ++i) {
     79             board[i].resize(n);
     80         }
     81         for (i = 0; i < m; ++i) {
     82             for (j = 0; j < n; ++j) {
     83                 scanf("%d", &board[i][j]);
     84             }
     85         }
     86         sol.setMatrixZero(board);
     87         for (i = 0; i < m; ++i) {
     88             for (j = 0; j < n; ++j) {
     89                 if (j > 0) {
     90                     printf(" %d", board[i][j]);
     91                 } else {
     92                     printf("%d", board[i][j]);
     93                 }
     94             }
     95             printf("
    ");
     96         }
     97         printf("
    ");
     98     }
     99     
    100     return 0;
    101 }
  • 相关阅读:
    OpenCV__Canny边缘检测和缩放(译)
    OpenCV_avi读入视频
    Canny边缘检测源码与图像结果(OpenCV2.0)
    OpenCV_累加一个三通道矩阵中的所有元素
    tomcat下出现 java.lang.OutOfMemoryError: Java heap space
    清空和截断数据库日志并收缩数据库
    java.lang.OutOfMemoryError: Java heap space 的解决
    java.lang.OutOfMemoryError: Java heap space 解决方法
    通达OA 2008 工作流数据库表的大致结构
    java获取本月的第一天和最后一天
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3606680.html
Copyright © 2020-2023  润新知