• 73#矩阵置零


    题目描述

    给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法

    示例 1:

    输入: 
    [
      [1,1,1],
      [1,0,1],
      [1,1,1]
    ]
    输出: 
    [
      [1,0,1],
      [0,0,0],
      [1,0,1]
    ]
    

    示例 2:

    输入: 
    [
      [0,1,2,0],
      [3,4,5,2],
      [1,3,1,5]
    ]
    输出: 
    [
      [0,0,0,0],
      [0,4,5,0],
      [0,3,1,0]
    ]
    

    进阶:

    • 一个直接的解决方案是使用 O(m**n) 的额外空间,但这并不是一个好的解决方案。
    • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
    • 你能想出一个常数空间的解决方案吗?

    常规方法

    思路

    • 扫描整个矩阵,把为 0 的元素的坐标记录下来,全部存为一个动态数组
    • 对动态数组中的每一个坐标值,把对应的整行和整列置为 0

    这样处理的速度较慢,因为可能会出现重复处理的情况。

    源代码

    public void setZeroes (int[][] matrix) {
        List<List<Integer>> flag = new ArrayList<List<Integer>>();
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                if (matrix[i][j] == 0) {
                    flag.add(Arrays.asList(i,j));
                }
            }
        }
    
        for (List<Integer> integers : flag) {
            int row = integers.get(0);
            int col = integers.get(1);
            for (int i = 0; i < matrix.length; i++) {
                matrix[i][col] = 0;
                for (int j = 0; j < matrix[i].length; j++) {
                    matrix[row][j] = 0;
                }
            }
    
        }
    }
    

    方法二:常数空间解决方案

    思路也比较类似,找到一个为 0 的元素,记录它的横纵坐标,再把相应的行列置零。需要注意的是,当原始矩阵中的 0 元素在第一行或者第一列时,需要用两个辅助变量记录下来,特殊处理一下。

    源代码

    public void setZeroes(int[][] matrix) {
        boolean fr = false,fc = false;
        for(int i = 0; i < matrix.length; i++) {
            for(int j = 0; j < matrix[0].length; j++) {
                if(matrix[i][j] == 0) {
                    if(i == 0) fr = true;
                    if(j == 0) fc = true;
                    matrix[0][j] = 0;
                    matrix[i][0] = 0;
                }
            }
        }
        for(int i = 1; i < matrix.length; i++) {
            for(int j = 1; j < matrix[0].length; j++) {
                if(matrix[i][0] == 0 || matrix[0][j] == 0) {
                    matrix[i][j] = 0;
                }
            }
        }
        if(fr) {
            for(int j = 0; j < matrix[0].length; j++) {
                matrix[0][j] = 0;
            }
        }
        if(fc) {
            for(int i = 0; i < matrix.length; i++) {
                matrix[i][0] = 0;
            }
        }
    }
    
  • 相关阅读:
    五分钟小知识:为什么说 ++i 的效率比 i++ 高?
    TwoSum 相关问题思路总结
    普通互联网公司 vs 文艺互联网公司 vs 二逼互联网公司
    让美国人颤抖的 5G 技术,到底有多牛
    计算机专业的学生也太太太太太惨了吧?
    中秋分享几个有点意思的 GitHub 项目
    浅谈滴滴派单算法
    数组特性的妙用!如何找到「缺失的第一个正数」
    图解两数之和的变形题之「有效三角形的个数」
    我命由我不由天,5个月逆袭百度,头条AI岗位,来挑战吗?
  • 原文地址:https://www.cnblogs.com/yuzhenzero/p/10197706.html
Copyright © 2020-2023  润新知