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

    73. Set Matrix Zeroes

    题目要求是二维数组中出现0的地方所在行和所在列全变成0。

    题目的关键是O(1)的时间复杂度,也就是在原地做。

    思路:将第一行、第一列,除了(0,0)这个点的其他所有点用来记录这一行或者这一列是否出现0。

    具体做法:先判断第一行第一列本身是否有0,用两个变量保存。然后遍历从(1,1)到(n-1,n-1)。一个位置出现了0,就把第一行的这一列和第一列的这一行的位置都置为0,用来表示这一行和这一列之后都需要被处理。然后遍历第一行和第一列,遇到0就将对应的一列或者一行置为0。最后再判断原始第一行第一列是否有0,如果有就把第一行或者第一列全置为0。

    为什么第一行、第一列可以用来作为标记,因为只要这一行这一列出现了,那对应的第一行或者第一列那个位置本身也要被置为0,并且不管这一行或者这一列出现多少次,反正都是要被置为0。

    class Solution {
    public:
        void setZeroes(vector<vector<int>>& matrix) {
            int m = matrix.size();
            if(m <= 0)
                return;
            int n = matrix[0].size();
            if(n <= 0)
                return;
            bool flag_row = false,flag_col = false;
            for(int j = 0;j < n;j++){
                if(matrix[0][j] == 0){
                    flag_row = true;
                    break;
                }
            }
            for(int i = 0;i < m;i++){
                if(matrix[i][0] == 0){
                    flag_col = true;
                    break;
                }
            }
            for(int i = 1;i < m;i++){
                for(int j = 1;j < n;j++){
                    if(matrix[i][j] == 0){
                        matrix[i][0] = 0;
                        matrix[0][j] = 0;
                    }
                }
            }
            for(int i = 1;i < m;i++){
                if(matrix[i][0] == 0){
                    for(int j = 1;j < n;j++)
                        matrix[i][j] = 0;
                }
            }
            for(int j = 1;j < n;j++){
                if(matrix[0][j] == 0){
                    for(int i = 1;i < m;i++)
                        matrix[i][j] = 0;
                }
            }
            if(flag_row){
                for(int j = 0;j < n;j++)
                    matrix[0][j] = 0;
            }
            if(flag_col){
                for(int i = 0;i < m;i++)
                    matrix[i][0] = 0;
            }
            return;
        }
    };
  • 相关阅读:
    接口的故事
    Bash CookBook(一)--基础
    Spring学习笔记(四)--MVC概述
    Spring学习笔记(三)--Convert System设计
    java web框架发展的新趋势--跨界轻型App
    由Strurts2漏洞引开谈谈web代码安全问题
    Java线程同步之一--AQS
    Android Studio 0.4 + PhoneGap 3.3 开发环境的搭建
    redis的多线程
    原电商设计框架
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/10924272.html
Copyright © 2011-2022 走看看