LeetCode 精选 TOP 面试题(Java 实现)—— 矩阵置零

一、题目描述

1.1 题目
  • 矩阵置零

  • 给定一个 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]
]
  • 进阶:
    (1)一个直接的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
    (2)一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
    (3)你能想出一个常数空间的解决方案吗?
1.2 知识点
  • 数组
1.3 题目链接

二、解题思路

2.1 自研思路
  • 判断首行首列是否存在零,并将判断结果存放于两个布尔变量中;
  • 遍历整个二维数组,如果某点为零,则在该点对应的首行和首列中标记(置零);
  • 根据首行首列存放的置零状态,对需要置零的行和列进行置零;
  • 根据开始时记录的首行和首列的状态,如果首行首列存在零则对其进行置零操作;

三、实现代码

3.1 自研实现
class Solution {
    public void setZeroes(int[][] matrix) {
    	// 判断首行是否存在零
        boolean rowFlag = false;
        for (int i = 0; i < matrix[0].length; i++) {
            if (matrix[0][i] == 0) {
                rowFlag = true;
                break;
            }
        }
		
		// 判断首列是否存在零
        boolean colFlag = false;
        for (int i = 0; i < matrix.length; i++) {
            if (matrix[i][0] == 0) {
                colFlag = true;
                break;
            }
        }

		// 当某个坐标为零时将其首行首列标记为零
        for (int i = 1; i < matrix.length; i++) {
            for (int j = 1; j < matrix[0].length; j++) {
                if (matrix[i][j] == 0){
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }

		// 列置零
        for (int i = 1; i < matrix[0].length; i++) {
            if (matrix[0][i] == 0) {
                for (int j = 0; j < matrix.length; j++) {
                    matrix[j][i] = 0;
                }
            }
        }

		// 行置零
        for (int i = 1; i < matrix.length; i++) {
            if (matrix[i][0] == 0) {
                for (int j = 0; j < matrix[0].length; j++) {
                    matrix[i][j] = 0;
                }
            }
        }
		
		// 处理首行首列需要置零的情况
        if (rowFlag){
            for (int i = 0; i < matrix[0].length; i++) {
                matrix[0][i] = 0;
            }
        }
        if (colFlag){
            for (int i = 0; i < matrix.length; i++) {
                matrix[i][0] = 0;
            }
        }
    }
}
发布了244 篇原创文章 · 获赞 32 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_40697071/article/details/103943632
今日推荐