哈希表题目:矩阵置零

news2024/9/28 1:18:43

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
      • 进阶
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法三
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:矩阵置零

出处:73. 矩阵置零

难度

3 级

题目描述

要求

给定一个 m × n \texttt{m} \times \texttt{n} m×n 的矩阵,如果一个元素为 0 \texttt{0} 0,则将其所在行和列的所有元素都设为 0 \texttt{0} 0

请使用原地算法。

示例

示例 1:

示例 1

输入: matrix   =   [[1,1,1],[1,0,1],[1,1,1]] \texttt{matrix = [[1,1,1],[1,0,1],[1,1,1]]} matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出: [[1,0,1],[0,0,0],[1,0,1]] \texttt{[[1,0,1],[0,0,0],[1,0,1]]} [[1,0,1],[0,0,0],[1,0,1]]

示例 2:

示例 2

输入: matrix   =   [[0,1,2,0],[3,4,5,2],[1,3,1,5]] \texttt{matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]} matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出: [[0,0,0,0],[0,4,5,0],[0,3,1,0]] \texttt{[[0,0,0,0],[0,4,5,0],[0,3,1,0]]} [[0,0,0,0],[0,4,5,0],[0,3,1,0]]

数据范围

  • m = matrix.length \texttt{m} = \texttt{matrix.length} m=matrix.length
  • n = matrix[0].length \texttt{n} = \texttt{matrix[0].length} n=matrix[0].length
  • 1 ≤ m,   n ≤ 200 \texttt{1} \le \texttt{m, n} \le \texttt{200} 1m, n200
  • -2 31 ≤ matrix[i][j] ≤ 2 31 − 1 \texttt{-2}^\texttt{31} \le \texttt{matrix[i][j]} \le \texttt{2}^\texttt{31} - \texttt{1} -231matrix[i][j]2311

进阶

  • 一个直观的解决方案是使用 O(mn) \texttt{O(mn)} O(mn) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(m   +   n) \texttt{O(m + n)} O(m + n) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个仅使用常量空间的解决方案吗?

解法一

思路和算法

最直观的做法是找到矩阵中所有等于 0 0 0 的元素,对于每个元素 0 0 0,将其所在行和列的所有元素置零。

如果直接在原矩阵中将元素置零,则无法判断等于 0 0 0 的元素是原始值等于 0 0 0 还是被置零,因此需要创建辅助矩阵,辅助矩阵和原矩阵的大小相同,辅助矩阵中的每个元素表示原矩阵中的该元素是否置零。

遍历原矩阵,对于原矩阵中每个等于 0 0 0 的元素,将辅助矩阵中相应位置的相同行和相同列的元素都设为置零。然后再次遍历原矩阵和辅助矩阵,对于辅助矩阵中置零的位置,将原矩阵中相应位置的元素置零。

代码

class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length, n = matrix[0].length;
        boolean[][] zero = new boolean[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    for (int k = 0; k < n; k++) {
                        zero[i][k] = true;
                    }
                    for (int k = 0; k < m; k++) {
                        zero[k][j] = true;
                    }
                }
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (zero[i][j]) {
                    matrix[i][j] = 0;
                }
            }
        }
    }
}

复杂度分析

  • 时间复杂度: O ( m n ( m + n ) ) O(mn(m + n)) O(mn(m+n)),其中 m m m n n n 分别是矩阵 matrix \textit{matrix} matrix 的行数和列数。需要遍历矩阵两次,第一次遍历需要将元素 0 0 0 所在行和列的所有元素标为置零,每个元素需要 O ( m + n ) O(m + n) O(m+n) 的处理时间,第二次遍历将矩阵中的标为置零的元素置零,每个元素需要 O ( 1 ) O(1) O(1) 的处理时间,因此总时间复杂度是 O ( m n ( m + n ) ) O(mn(m + n)) O(mn(m+n))

  • 空间复杂度: O ( m n ) O(mn) O(mn),其中 m m m n n n 分别是矩阵 matrix \textit{matrix} matrix 的行数和列数。需要创建和原矩阵大小相同的辅助矩阵记录原矩阵中的每个元素是否置零。

解法二

思路和算法

解法一的时间复杂度和空间复杂度都较高,可以优化。

由于矩阵中每个元素 0 0 0 所在行和列的所有元素需要置零,因此只需要记录矩阵的每一行和每一列是否需要置零即可。

创建两个哈希表分别记录矩阵的每一行和每一列是否需要置零,遍历矩阵一次,对于每个等于 0 0 0 的元素,在两个哈希表中分别记录其所在行和列需要置零,遍历结束之后即可得到所有需要置零的行和列。然后再次遍历矩阵,对于每个元素,如果两个哈希表中至少有一个哈希表记录了该元素所在的行或列需要置零,则将该元素置零。

实现方面,可以用两个数组分别记录矩阵的每一行和每一列是否需要置零。

代码

class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length, n = matrix[0].length;
        boolean[] rows = new boolean[m];
        boolean[] columns = new boolean[n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    rows[i] = true;
                    columns[j] = true;
                }
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (rows[i] || columns[j]) {
                    matrix[i][j] = 0;
                }
            }
        }
    }
}

复杂度分析

  • 时间复杂度: O ( m n ) O(mn) O(mn),其中 m m m n n n 分别是矩阵 matrix \textit{matrix} matrix 的行数和列数。需要遍历矩阵两次,第一次遍历需要将元素 0 0 0 所在行和列在两个哈希表中记录,每个元素需要 O ( 1 ) O(1) O(1) 的处理时间,第二次遍历将矩阵中的标为置零的元素置零,每个元素需要 O ( 1 ) O(1) O(1) 的处理时间,因此总时间复杂度是 O ( m n ) O(mn) O(mn)

  • 空间复杂度: O ( m + n ) O(m + n) O(m+n),其中 m m m n n n 分别是矩阵 matrix \textit{matrix} matrix 的行数和列数。需要创建两个哈希表(或数组)分别记录矩阵的每一行和每一列是否需要置零,各需要 O ( m ) O(m) O(m) O ( n ) O(n) O(n) 的空间。

解法三

思路和算法

解法二仍需要 O ( m + n ) O(m + n) O(m+n) 的额外空间。如果要将空间复杂度降低到 O ( 1 ) O(1) O(1),必须在矩阵内部记录每一行和每一列是否需要置零。

在矩阵内部记录置零信息,可以使用第 0 0 0 行和第 0 0 0 列记录。第 0 0 0 行的一个元素如果是 0 0 0,则表示该元素所在列需要置零;第 0 0 0 列的一个元素如果是 0 0 0,则表示该元素所在行需要置零。

如果直接修改矩阵的第 0 0 0 行和第 0 0 0 列的元素,则无法记录矩阵的第 0 0 0 行和第 0 0 0 列是否需要置零,因此需要使用两个变量分别记录矩阵的第 0 0 0 行和第 0 0 0 列是否需要置零。

矩阵置零的完整过程如下。

  1. 遍历矩阵的第 0 0 0 行和第 0 0 0 列,记录矩阵的第 0 0 0 行和第 0 0 0 列是否需要置零。

  2. 遍历矩阵的其余元素(指除了第 0 0 0 行和第 0 0 0 列的全部元素,下同),对于每个等于 0 0 0 的元素,将其所在行的第 0 0 0 列的元素和所在列的第 0 0 0 行的元素置零。

  3. 再次遍历矩阵的其余元素,对于每个元素,如果一个元素所在的行或列需要置零,则将该元素置零。

  4. 如果矩阵的第 0 0 0 行需要置零,则将矩阵的第 0 0 0 行元素全部置零;如果矩阵的第 0 0 0 列需要置零,则将矩阵的第 0 0 0 列元素全部置零。

如果矩阵的第 0 0 0 行或第 0 0 0 列的一个元素原本就是 0 0 0,则该元素所在行和列需要置零,上述解法同样适用于该情况。

代码

class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length, n = matrix[0].length;
        boolean rowZero = false, columnZero = false;
        for (int j = 0; j < n; j++) {
            if (matrix[0][j] == 0) {
                rowZero = true;
                break;
            }
        }
        for (int i = 0; i < m; i++) {
            if (matrix[i][0] == 0) {
                columnZero = true;
                break;
            }
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][j] == 0) {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][0] == 0 || matrix[0][j] == 0) {
                    matrix[i][j] = 0;
                }
            }
        }
        if (rowZero) {
            for (int j = 0; j < n; j++) {
                matrix[0][j] = 0;
            }
        }
        if (columnZero) {
            for (int i = 0; i < m; i++) {
                matrix[i][0] = 0;
            }
        }
    }
}

复杂度分析

  • 时间复杂度: O ( m n ) O(mn) O(mn),其中 m m m n n n 分别是矩阵 matrix \textit{matrix} matrix 的行数和列数。最多需要遍历矩阵中的每个元素两次。

  • 空间复杂度: O ( 1 ) O(1) O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/349669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

oracle单库重建undo表空间步骤

前言&#xff1a;undo表空间不足可直接增加空间&#xff1b; alter tablespace UNDOTBS1 add datafile /data/oradata/datafile/UNDOTBS102.dbf size 30g autoextend off; 注&#xff1a;单次增加最大不得超过32G 回收空间 缩小表空间直接可以resize命令缩小&#xff1b…

webpack(高级)--创建自己的loader 同步loader 异步loader loader参数校验

webpack 创建自己的loader loader是用于对模块的源代码进行转换&#xff08;处理&#xff09; 我们使用过很多loader 比如css-loader style-loader babel-loader 我么如果想要自己创建一个loader 首先创建webpack环境 pnpm add webpack webpack-cli -D 之后创建loader模块…

Hadoop初步理解

产生原因 在之前&#xff0c;数据量小&#xff0c;增长速度慢&#xff0c;且数据基本都是文件。储存和处理这些数据并不麻烦&#xff0c;单个存储单元和处理器组合就可以。 之后随着互联网发展&#xff0c;产生了大量多种形式的数据。 非结构化数据&#xff1a;邮件、图像、音…

盘点3个.Net开发的WMS仓库管理系统

更多开源项目请查看&#xff1a;一个专注推荐.Net开源项目的榜单 仓库管理系统在企业中&#xff0c;重要性越来越高&#xff0c;不仅可以提高效率&#xff0c;还能降低企业的压力&#xff0c;企业通过协调和优化资源使用和物料流动&#xff0c;能极大程度地提升了管理效率&…

中国500强|长虹控股集团携手契约锁,推动采购-人事业务电子签

四川长虹电子控股集团&#xff08;以下简称“长虹控股集团”&#xff09;是国内知名的电器制造商之一&#xff0c;拥有六家上市公司、一家新三板的公众公司&#xff0c;入选世界品牌500强、中国企业家协会发布的中国500强企业榜单。此次&#xff0c;长虹控股集团携手契约锁打造…

数据分析与SAS学习笔记3

SAS在最新的展示图&#xff0c;表现力比较丰富。 SAS的处理流程&#xff1a; 数据步 过程步&#xff1a; ETL是数据分析非常重要的步骤。70%-90%花在收集数据以及整理数据&#xff0c;数据分析数据的时间不是很多的。 一个完整的数据步和过程步&#xff1a; 数据步基本语句总…

新手学习node.js基础,node.js安装过程,node.js运行环境及javascript运行环境.

学习node.js1.什么是node.js?2.node.js中的javaScript运行环境3.node.js可以做什么&#xff1f;4. node.js学习思路5.node.js环境的安装6.如何在node.js中执行JavaScript代码1.什么是node.js? node.js是一个基于Chrome v8 引擎的JavaScript运行环境(后端) node.js官网 &…

Flutter for Android

将 Flutter 添加到现有应用程序 在 Flutter 中一次重写整个应用程序是不切实际的。 对于这些情况&#xff0c;Flutter 可以作为库或模块逐步集成到您现有的应用程序中。 然后可以将该模块导入到您的 Android 或 iOS&#xff08;当前支持的平台&#xff09;应用程序中&#xff…

GEE学习笔记 八十六:分类中的特征重要性分析

之前在GEE中做随机森林分类时候&#xff0c;很多人都在问如何做特征重要性分析&#xff1f;但是在GEE之前并没有相关API可以做特征重要性分析&#xff0c;最新的API更新后GEE也可以做特征重要性分析了。 1、目前常用的包含特征重要信息分析的分类方法包括&#xff1a; &#…

基础篇:03-SpringCloud工程部署启动

目录 1.工程搭建部署 方案一&#xff1a;完整工程导入 方案二&#xff1a;从零开始搭建 1.工程与module创建 2.数据库导入 3.项目启动 3.1 启动并访问user-service 3.2 启动并访问order-service 4.服务远程调用 时序图说明 服务远程调用实现 注入RestTemplate Res…

自学web前端觉得好难,可能你遇到了这些困境

好多人跟我说上学的时候也学过前端&#xff0c;毕业了想从事web前端开发的工作&#xff0c;但自学起来好难&#xff0c;快要放弃了&#xff0c;所以我总结了一些大家遇到的困境&#xff0c;希望对你会有所帮助。 目录 1. 意志是否坚定 2. 没有找到合适自己的老师 3. 为了找…

论文阅读【PAMI_2022】FSGANv2: Improved Subject Agnostic Face Swapping and Reenactment

论文阅读【PAMI_2022】FSGANv2: Improved Subject Agnostic Face Swapping and Reenactment论文的缩写全拼一、摘要&#xff08;问题&#xff0c;贡献&#xff0c;效果&#xff09;二、引言&#xff08;idea&#xff09;三、方法(FSGAN)1.Detection and tracking2.Generator ar…

node学习-3:服务器渲染和客户端渲染

1. 概念 一.服务端渲染&#xff0c;后端嵌套模板&#xff0c;后端渲染模板&#xff0c;SSR&#xff08;后端把页面组装好&#xff09; 做好静态页面&#xff0c;动态效果 把前端代码提供给后端&#xff0c;后端则把静态html以及里面的假数据给删除掉 通过模板进行动态生成h…

8个让你收入翻倍的高质量免费网站

毕业几年了&#xff0c;如果你的月薪不到1w&#xff0c;还是做着重复机械的动作&#xff0c;现在马上往下看&#xff0c;今天分享6个资源网站让你的收入暴增&#xff0c;尤其是最后一个。每天花一个小时&#xff0c;让你工资翻倍&#xff0c;从此在职场横着走&#xff0c;再也不…

GEE学习笔记 八十三:【GEE之Python版教程十三】几何图形

遥感分析中用到的数据主要就是这两大类&#xff1a;矢量数据和栅格数据。在Google Earth Eninge中&#xff0c;它为我们讲这两类数据封装成为了以下几类数据。 下面几节内容我会依次讲解相关内容的详细信息&#xff0c;这一节先讲一下几何图形ee.geometry。 学习任何新的东西首…

设计模式之抽象工厂模式(C++)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、抽象工厂模式是什么&#xff1f; 抽象工厂模式是一种创建型的软件设计模式&#xff0c;该模式相当于升级版的工厂模式。 如果…

采集知乎评论

声明 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! excel保存效果图: 首先我们找一个评论比较多的帖子,如下图所示有874条评论 点击评论…

算法刷刷刷| 回溯篇| 组合问题大集合

77.组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4], [3,4], [2,3], [1,2], [1,3], [1,4],] import java.util.ArrayList; import java.util.List;clas…

可靠、稳定、安全,龙蜥云原生容器镜像正式发布!

文/云原生 SIG01背景随着云原生的蓬勃发展&#xff0c;越来越多的企业在自己的生产或者测试环境使用云原生技术&#xff0c;而容器镜像正是云原生技术中应用的实际运行环境。一个好的容器运行环境即容器镜像会真正关系到应用的体验、演进和维护。那么选择一个好的容器镜像需要考…

Flink实时同步MySQL与Doris数据

参考&#xff1a; 技术解析&#xff5c;Doris Connector 结合 Flink CDC 实现 MySQL 分库分表 Exactly Once 精准接入-阿里云开发者社区 逻辑图&#xff1a; 1. Flink环境&#xff1a; https://flink.apache.org/zh/ 下载flink-1.15.1 wget https://dlcdn.apache.org/flink…