博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Set Matrix Zeroes
阅读量:4099 次
发布时间:2019-05-25

本文共 5864 字,大约阅读时间需要 19 分钟。

题目地址:

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

这个题目的关键就在于不要让修改后的0“传染”给其他行列,所以我们可以这么想:如果提前把0元素所在的行列坐标存储起来,然后再去置0不就可以了吗?比如我们可以存储在一个HashMap中,key作为行坐标,value可以是列坐标的列表,代码实现如下:

import java.util.ArrayList;import java.util.HashMap;import java.util.Map;public class SetMatrixZeroes {
public static void setZeroes(int[][] matrix) { if (matrix == null) return; if (matrix.length == 0) return; HashMap
> zeroElementsCoordinateSet = new HashMap<>(); for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[i].length; j++) { if (matrix[i][j] == 0) { if (zeroElementsCoordinateSet.containsKey(i)) { ArrayList
arrayList = zeroElementsCoordinateSet.get(i); arrayList.add(j); zeroElementsCoordinateSet.put(i, arrayList); } else { ArrayList
arrayList = new ArrayList<>(); arrayList.add(j); zeroElementsCoordinateSet.put(i, arrayList); } } } } for (Map.Entry
> entry : zeroElementsCoordinateSet.entrySet()) { setMatrixRowZeros(matrix, entry.getKey()); for (Integer e : entry.getValue()) { setMatrixColZeros(matrix, e); } } } private static void setMatrixRowZeros(int[][] matrix, int x) { if (matrix == null) return; if (matrix.length == 0) return; if (matrix.length <= x) return; for (int i = 0; i < matrix[0].length; i++) matrix[x][i] = 0; } private static void setMatrixColZeros(int[][] matrix, int y) { if (matrix == null) return; if (matrix.length == 0) return; if (matrix[0].length <= y) return; for (int i = 0; i < matrix.length; i++) matrix[i][y] = 0; } private static void printMatrix(int[][] matrix) { if (matrix == null) return; if (matrix.length == 0) { System.out.println("[]"); return; } System.out.println("["); for (int[] aMatrix : matrix) { System.out.print(" ["); for (int j = 0; j < aMatrix.length; j++) { System.out.print(aMatrix[j]); if (j != aMatrix.length - 1) System.out.print(", "); } System.out.println("]"); } System.out.println("]"); } 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); printMatrix(matrix); }}

但是这么写貌似效率不是那么高,至少我们又使用了新空间HashMap,能不能再优化一下呢?

另一个想法就是争取在原地把这个事情搞定,我们可以观察到,如果某个坐标有为0的元素,那么这个坐标对应的第一行和第一列的元素也肯定为0,那么我们可以先处理一下坐标大于第一行和第一列的元素,这样做的目的就是为了将一个0转换为两个0,并且都放在了第一行和第一列,也就是做了边缘化的操作。

我们再观察,如果第一行或者第一列原本也有0元素的话,那么结果很显然,第一行和第一列要全部置0,如果在上一步的基础上,再特殊处理一下边界,那么这个问题就解决了,而且是原地解决:

public class SetMatrixZeroes {
public static void setZeroes(int[][] matrix) { if (matrix == null) return; if (matrix.length == 0) return; boolean firstRowHasZero = false; boolean firstColHasZero = false; for (int i = 0; i < matrix[0].length; i++) { if (matrix[0][i] == 0) { firstRowHasZero = true; } } for (int i = 0; i < matrix.length; i++) { if (matrix[i][0] == 0) { firstColHasZero = true; } } for (int i = 1; i < matrix.length; i++) { for (int j = 1; j < matrix[i].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) setMatrixColZeros(matrix, i); } for (int i = 1; i < matrix.length; i++) { if (matrix[i][0] == 0) setMatrixRowZeros(matrix, i); } if (firstRowHasZero) { setMatrixRowZeros(matrix, 0); } if (firstColHasZero) { setMatrixColZeros(matrix, 0); } } private static void setMatrixRowZeros(int[][] matrix, int x) { if (matrix == null) return; if (matrix.length == 0) return; if (matrix.length <= x) return; for (int i = 0; i < matrix[0].length; i++) matrix[x][i] = 0; } private static void setMatrixColZeros(int[][] matrix, int y) { if (matrix == null) return; if (matrix.length == 0) return; if (matrix[0].length <= y) return; for (int i = 0; i < matrix.length; i++) matrix[i][y] = 0; } private static void printMatrix(int[][] matrix) { if (matrix == null) return; if (matrix.length == 0) { System.out.println("[]"); return; } System.out.println("["); for (int[] aMatrix : matrix) { System.out.print(" ["); for (int j = 0; j < aMatrix.length; j++) { System.out.print(aMatrix[j]); if (j != aMatrix.length - 1) System.out.print(", "); } System.out.println("]"); } System.out.println("]"); } 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}}; setZeroesII(matrix); printMatrix(matrix); }}

这种方法的空间复杂度为O(1)。

转载地址:http://tihii.baihongyu.com/

你可能感兴趣的文章
Spring Boot在微服务中的最佳实践
查看>>
请把 .gitattributes 加到你的 Git 仓库中
查看>>
太赞了!美团T9终于整理出Java架构之完美设计实战开源文档
查看>>
一篇文章让你了解基于Spring的测试
查看>>
10个微服务架构设计的最佳实践
查看>>
分布式ID生成策略,我和面试官掰扯了一个小时
查看>>
逆袭大厂之路——Java程序员必备金九银十跳槽面试涨薪秘籍
查看>>
清华架构师熬夜整理,带你走进Kafka消息中间件
查看>>
GitHub上标星120k的Java进阶面试教程等!(建议收藏)
查看>>
为什么说Java程序员到了必须掌握SpringBoot的时候
查看>>
基于Rust-vmm实现Kubernetes运行时
查看>>
阿里P8架构师呕心沥血整理出这份Spring Cloud实战
查看>>
Spring Boot 如何快速集成 Redis 哨兵?
查看>>
认识 MongoDB 一篇文章就够了认识 MongoDB 一篇文章就够了
查看>>
聊聊Mysql——慢sql优化方法论
查看>>
近万服务实例稳定运行 0 故障,携程微服务架构是如何落地的?
查看>>
就这一次:TCP、IP、操作系统、Netty、算法一次性讲透
查看>>
大厂面试题中爱问的「调度算法」,20张图一举拿下
查看>>
一篇文章带你深入了解MySQL 索引相关
查看>>
GitHub上标星高达55.3Kstar的牛逼项目,附项目源代码
查看>>