题意很简单,就是把某个为0的元素所在的行和列全部归0。

要求是使空间复杂度尽可能小。

有两种写法,一种是空间复杂度O(m + n)的;一种是O(1)的。

O(m + n):

 1 class Solution {
 2     public void setZeroes(int[][] matrix) {
 3         int m = matrix.length;
 4         if (m == 0)
 5             return;
 6         int n = matrix[0].length;
 7         Map<Integer, Boolean> rows = new HashMap<>();
 8         Map<Integer, Boolean> cols = new HashMap<>();
 9         for (int i = 0; i < m; i++) {
10             for (int j = 0; j < n; j++) {
11                 if (matrix[i][j] == 0) {
12                     rows.put(i, true);
13                     cols.put(j, true);
14                 }
15             }
16         }
17         for (int i = 0; i < m; i++) {
18             for (int j = 0; j < n; j++) {
19                 if (rows.containsKey(i) || cols.containsKey(j)) {
20                     matrix[i][j] = 0;
21                 }
22             }
23         }
24     }
25 }

这是我最开始想的方法,即利用一个额外的关联数组(Map, Set实现都可以)记录哪些行和列需要归零。

O(1):

 1 class Solution {
 2     public void setZeroes(int[][] matrix) {
 3         int m = matrix.length;
 4         if (m == 0)
 5             return;
 6         int n = matrix[0].length;
 7
 8         boolean resetFirstRow = false;
 9         boolean resetFirstCol = false;
10
11         for (int i = 0; i < m; i++) {
12             for (int j = 0; j < n; j++) {
13                 if (matrix[i][j] == 0) {
14                     resetFirstRow = i == 0 ? true : resetFirstRow;
15                     resetFirstCol = j == 0 ? true : resetFirstCol;
16                     matrix[i][0] = 0;
17                     matrix[0][j] = 0;
18                 }
19             }
20         }
21         //将除了第一行和第一列外的其他部分归零
22         for (int i = 1; i < m; i++) {
23             for (int j = 1; j < n; j++) {
24                 if (matrix[i][0] == 0 || matrix[0][j] == 0) {
25                     matrix[i][j] = 0;
26                 }
27             }
28         }
29         //将第一行归零
30         if (resetFirstRow) {
31             for (int j = 0; j < n; j++)
32                 matrix[0][j] = 0;
33         }
34         //将第一列归零
35         if (resetFirstCol) {
36             for (int i = 0; i < m; i++)
37                 matrix[i][0] = 0;
38         }
39     }
40 }

这个方法最强的地方是它直接利用第一行和第一列作为桶来记录该行/列是否需要归零,效果和使用关联数组完全一致。

不过这样做可能会对第一行/列进行改动,所以需要两个布尔类型的变量来判断第一行/列是否真的需要归零。

代码中第14 ~ 17行的写法比较巧妙,总是先判断第一行/列的某个元素,然后再修改它。因此改动不会影响我们的判断。

当然如果按最最最保险的方法的写,可以将第一行,第一列和剩下的部分分开单独判断,稍微麻烦一点。

总结:

1. 可以利用已有数组的一部分记录信息,从而避免引入额外的数据结构(空间)。

转载于:https://www.cnblogs.com/hiyashinsu/p/10693824.html

leetcode 73 矩阵归零相关推荐

  1. Java实现 LeetCode 73 矩阵置零

    73. 矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [ [1,1,1], [1,0,1], [1,1,1] ...

  2. leetcode 73 矩阵置零 C++ 两种解法

    leetcode 73 两种解法~~,没有一个是我想出来的,哈哈~~ one class Solution {public:void setZeroes(vector<vector<int ...

  3. LeetCode 73. 矩阵置零(两个标记变量)

    73. 矩阵置零 我们可以用矩阵的第一行和第一列作为两个标记数组,以达到 O(1)O(1) 的额外空间. 但这样会导致原数组的第一行和第一列被修改,无法记录它们是否原本包含 0.因此我们需要额外使用两 ...

  4. LeetCode 73矩阵置零74搜素二维矩阵75颜色分类

    新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打 ...

  5. leetcode 73 矩阵置零 Python

    矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [[1,1,1],[1,0,1],[1,1,1] ] 输出: [ ...

  6. leetcode 73. 矩阵置零

    给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 .请使用 原地 算法. 进阶: 一个直观的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案. ...

  7. Leetcode算法Java全解答--73. 矩阵置零

    Leetcode算法Java全解答–73. 矩阵置零 文章目录 Leetcode算法Java全解答--73. 矩阵置零 题目 想法 结果 总结 代码 我的答案 大佬们的答案 测试用例 其他 题目 给定 ...

  8. LeetCode 73. Set Matrix Zeroes

    LeetCode 73. Set Matrix Zeroes Solution1:我的答案 比较笨,算法时间复杂度是O(mn)O(mn)O(mn),占用额外空间是O(m+n)O(m+n)O(m+n) ...

  9. LeetCode—5757. 矩阵中最大的三个菱形和(Get Biggest ...)[中等]—分析及代码(Java)

    LeetCode--5757. 矩阵中最大的三个菱形和[Get Biggest Three Rhombus Sums in a Grid][中等]--分析及代码[Java] 一.题目 二.分析及代码 ...

  10. LeetCode 329. 矩阵中的最长递增路径(记忆化递归)

    文章目录 1. 题目 2. 解题 2.1 记忆化递归 2.2 拓扑排序 1. 题目 给定一个整数矩阵,找出最长递增路径的长度. 对于每个单元格,你可以往上,下,左,右四个方向移动. 你不能在对角线方向 ...

最新文章

  1. c语言图论,图论问题------大家过来看看
  2. edge新版 能够正则式_Python爬虫七 数据提取之正则
  3. windows10 下 vscode + cmake 编译 Qt6 代码
  4. python是在linux系统下运行的吗_Linux系统下python代码运行shell命令的方法
  5. 基于大数据的图书推荐系统
  6. python汇率转换
  7. 7个最佳博客名称生成器,可帮助您找到好的博客名称提示
  8. Google Safe Browsing API的实施
  9. [每日一题] 11gOCP 1z0-052 :2013-09-28 ORA-01555: snapshot too old......................C52
  10. 快排的三种优化方式。
  11. Mezo Playing ZomaDeadlineYet Another Meme ProblemHQ9+
  12. 用 visual foxpro 也可以编写“迅雷下载”
  13. 智慧金融时代,大数据和AI如何为业务赋能
  14. Python 信号处理——时域同步平均技术(TSA)
  15. Python-3.7.0常用数据类型源码—列表
  16. 前端学习第九弹:简易的聊天界面
  17. 新手必须掌握的20个摄影构图法 转
  18. BERT原理和结构详解
  19. LocalDateTime加一年取有效期23:59:59
  20. pycharm中pyinstaller封装打包多个py文件的过程

热门文章

  1. XXX客户2020年护网行动总结报告
  2. 如何提高自己的分析能力
  3. The name `AssetDatabase' does not exist in the current context
  4. 【一名合格前端工程师的自检清单】--自检答案
  5. 并发编程 - lost wakeup
  6. Shell脚本之正则表达式详解
  7. 职场上做“独狼”注定失败
  8. 中柏pad7安装linux,中柏电脑下载与安装win7iso镜像系统教程
  9. 2017年个人目标及计划
  10. oracle 按时间每五分钟分割,Oracle 5分钟或30分钟分割方法