• [leetcode]73.Set Matrix Zeroes


    /**
     * Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
    
     click to show follow up.
    
     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?
     */
    /*
    * 思路是通过第一行和第一列记录0所在的位置,容易出现的两个问题
    * 1.由于一开始要用第一行和第一列记录,所以它们的数据是不能变的,所以应该首先用两个布尔类型记录
    * 它们里边是否存在0,第一行存在0的话,最后要把第一行全部置零,第一列存在0,最后将第一列全部置零
    * 2.记录下0的位置之后,再根据0的位置将对应行列置零,注意这时还是不能改变第一行和第一列的位置,
    * 因为行列置零是分别进行的,第一行和第一列的数据后边要用到,不能改变*/
    public class Q73SetMatrixZeroes {
        public static void main(String[] args) {
            int[][] matrix = new int[][]{{0,0,0,5},{4,3,1,4},{0,1,1,4},{1,2,1,3},{0,0,1,1}};
            setZeroes(matrix);
            for (int i = 0; i < matrix.length; i++) {
                System.out.println(Arrays.toString(matrix[i]));
            }
        }
        public static void setZeroes(int[][] matrix) {
            boolean row = false;
            boolean col = false;
            int m = matrix.length;
            int n = matrix[0].length;
            //判断第一列和第一行有没有0
            for (int i = 0; i < m; i++) {
                if (matrix[i][0] == 0)
                {
                    col = true;
                    break;
                }
            }
            for (int i = 0; i < n; i++) {
                if (matrix[0][i] == 0)
                {
                    row = true;
                    break;
                }
            }
            //用第一行和第一列记录下数列中出现的0的位置
            for(int i = 1;i < m;i++)
            {
                for (int j = 1; j < n; j++) {
                    if (matrix[i][j] == 0)
                    {
                        matrix[0][j] = 0;
                        matrix[i][0] = 0;
                    }
                }
            }
            //根据0的位置将它所在的列全部置零
            for (int i = 1;i < n;i++)
            {
                if (matrix[0][i] == 0)
                {
                    for (int j = 1;j < m;j++)
                        matrix[j][i] = 0;
                }
            }
            //根据0的位置将它所在的行全部置零
            for (int i = 1;i < m;i++)
            {
                if (matrix[i][0] == 0)
                {
                    for (int j = 1;j < n;j++)
                        matrix[i][j] = 0;
                }
            }
            //如果第一行存在0那么将第一行全部置零
            if (row == true)
            {
                for (int i = 0; i < n; i++) {
                    matrix[0][i] = 0;
                }
            }
            //如果第一列存在0那么将第一列全部置零
            if (col == true)
            {
                for (int i = 0; i < m; i++) {
                    matrix[i][0] = 0;
                }
            }
        }
    }
  • 相关阅读:
    沙漠之王(0/1分数规划+ 最小生成树)
    野餐规划(最小生成树性质)⭐
    走廊泼水节(最小生成树定理)⭐
    兄弟选择器+否定伪类
    子元素的伪类
    属性选择器
    伪元素
    伪类选择器
    Java连接Mysql由于版本更新报错
    Mac下安装SQL
  • 原文地址:https://www.cnblogs.com/stAr-1/p/7264298.html
Copyright © 2020-2023  润新知