LeetCode73.矩阵置零

news2024/10/6 6:39:40

 这道题我感觉还是挺简单的,一下子就想到了,不过我的算法很简单很垃圾,效率很低,我一看完题的想法就是直接遍历一遍数组,然后把为0的元素的行和列都存起来,然后把这些行和列都置零就好了,但是这里会有重复,所以用HashSet来存就好了,然后就写出来了,以下是我的代码:

class Solution {
    public void setZeroes(int[][] matrix) {
        int r = matrix.length;
        int c = matrix[0].length;
       Set<Integer> row = new HashSet<Integer>();
       Set<Integer> column = new HashSet<Integer>();
       for(int i =0;i<r;i++){
           for(int j=0;j<c;j++){           
             if(matrix[i][j] == 0){
                 row.add(i);
                 column.add(j);
             }
           }
       }
       
       for(Integer i : row){
           matrix[i] = new int[c];
       }
       
       for(Integer j : column){
           for(int i =0;i<r;i++){
               matrix[i][j]=0;
           }
       }
    }
}

看看题解,题解的第一种方法和我的差不多,但是他的感觉更容易理解,它没有拿两个set去记录要置零的行和列,而是拿两个boolean数组来标记(row标记行,col标记列),先第一遍遍历数组,对于遍历到的元素X,如果它等于0,就把两个标记数组中它对应的行和列改为true;然后第二遍遍历数组,对于遍历到的元素X,如果他对应的行或者列在标记数组中是true,就把这个元素改为0,这样其实只要两遍完整的遍历数组就可以,以下是题解第一种解法的代码:

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

题解的第二种解法就是不另外开辟两个数组来标记,而是拿数组的第一行和第一列来标记,但是这样的话第一行和第一列的数就改变了,所以他创建了两个boolean变量flagCol0和flagRow0来标记第一行中是否有0,先遍历第一行,如果存在一个0就把flagRow0改为true,同理然后遍历第一列,然后去遍历数组中剩下的其他元素,如果是0,就把第一行和第一列中对应坐标下的元素改为0,然后再重新遍历一遍除第一行第一列外的元素,如果这个元素的行和列在标记数组(第一行第一列)中是0,那就把这个元素改成0(和题解1一样,只是标记数组变了),最后再看第一行和第一列的那两个标记变量是不是true,如果是再把第一行和第一列改成0,就可以了。我看完还有一个小疑惑,在第一遍遍历中把第一行和第一列的元素改成了0,如果两个标记变量都是false你没把第一行而第一列中改了的元素改回去啊,但一下子就想通了,如果把第一行或第一列中的元素改成了0说明这个元素在有0的行或列,它本来就要变成0,所以是我想多了,以下是题解二代码:

class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length, n = matrix[0].length;
        boolean flagCol0 = false, flagRow0 = false;
        for (int i = 0; i < m; i++) {
            if (matrix[i][0] == 0) {
                flagCol0 = true;
            }
        }
        for (int j = 0; j < n; j++) {
            if (matrix[0][j] == 0) {
                flagRow0 = true;
            }
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][j] == 0) {
                    matrix[i][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 (flagCol0) {
            for (int i = 0; i < m; i++) {
                matrix[i][0] = 0;
            }
        }
        if (flagRow0) {
            for (int j = 0; j < n; j++) {
                matrix[0][j] = 0;
            }
        }
    }
}

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

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

相关文章

IP地址、子网掩码、网络地址、广播地址、IP网段

文章目录 IP地址IP地址分类子网掩码网络地址广播地址IP网段 本文主要讨论iPv4地址。 IP地址 实际的 IP 地址是一串32 比特的数字&#xff0c;按照 8 比特&#xff08;1 字节&#xff09;为一组分成 4 组&#xff0c;分别用十进制表示然后再用圆点隔开&#xff0c;这就是我们平…

chkdsk H:/F

chkdsk H:/F TF卡损坏

nios里面打开eclipse遇到Unresolved inclusion: “system.h“等问题

问题&#xff1a;在Nios中打开软核部分代码时&#xff0c;遇到一堆Unresolved inclusion: "system.h"等问题报错 原因&#xff1a;bsp文件和软核没关联&#xff0c;导致找不到头文件地址&#xff0c;关联一下就好 解决步骤&#xff1a; 右键bsp文件&#xff0c;点击…

虚幻引擎集成web前端<一>:win环境UE4.27导出像素流并集成到vue2环境(附案例)

本案例附件&#xff1a;https://download.csdn.net/download/rexfow/88303544 第一部分&#xff1a;虚幻引擎导出像素流windows包 第1步&#xff1a;软件设置 -AudioMixer -PixelStreamingIPlocalhost -PixelStreamingPort8888 第2步&#xff1a;信令服务器设置 1、执行run_l…

2023移动软件开发实验6

2023年夏季《移动软件开发》实验报告 姓名和学号&#xff1f;本实验属于哪门课程&#xff1f;中国海洋大学23夏《移动软件开发》实验名称&#xff1f;实验6&#xff1a;推箱子博客地址&#xff1f;XXXXXXXGithub仓库地址&#xff1f;https://github.com/enfantsRichesDeprimes…

十三、MySQL(DQL)语句执行顺序

1、DQL语句执行顺序: &#xff08;1&#xff09;from来决定表 # where来指定查询的条件 &#xff08;2&#xff09;group by指定分组 # having指定分组之后的条件 &#xff08;3&#xff09;select查询要返回哪些字段 &#xff08;4&#xff09;order by根据字段内容&#…

7.0: Dubbo服务调用源码解析

课程内容 服务提供者处理请求流程解析服务消费发送请求流程解析服务提供者端线程模型解析服务消费者端线程模型解析1.服务提供者处理请求流程解析 processon链接:服务调用流程图| ProcessOn免费在线作图,在线流程图,在线思维导图 2. 服务消费端执行逻辑 MockClusterInvoker.in…

【大数据之Kafka】七、Kafka Broker之Kafka副本

1 副本基本信息 Kafka 副本可以提高数据可靠性。分为Leader 和 Follower&#xff1b;Kafka 生产者只会把数据发往 Leader&#xff0c;然后 Follower 找Leader 进行同步数据。   Kafka 默认副本 1 个&#xff0c;生产环境一般配置为 2 个&#xff0c;保证数据可靠性&#xff1…

SAP-PP:基础概念笔记-4(物料主数据视图)

文章目录 前言一、基本视图二、分类视图三、销售视图四、采购五、生产计划和执行视图六、总工厂数据/存储七、质量管理八、会计九、成本系统创建示例&#xff1a;创建一个齿轮物料的主数据事务代码:MM01&#xff0c;另一种方式spro->xxxx 总结 前言 物料主数据为许多组织创…

linux并发服务器 —— 项目实战(九)

阻塞/非阻塞、同步/异步 数据就绪 - 根据系统IO操作的就绪状态 阻塞 - 调用IO方法的线程进入阻塞状态&#xff08;挂起&#xff09; 非阻塞 - 不会改变线程的状态&#xff0c;通过返回值判断 数据读写 - 根据应用程序和内核的交互方式 同步 - 数据的读写需要应用层去读写 …

DX底图还原

直接定位到这个地方 我们可以看到他有一个Bn函数&#xff0c;其中传入的参数有n,e,r,t 分别是这些东西 但是我们只需要还原的列表就得看是哪一段是咯 An((i (i r.split("/"))[i.length - 1]).split(".")[0]) 发现是他之后我们就直接把这个函数扣下来&…

【vue2第十三章】自定义指令 自定义v-loading指令

自定义指令 像 v-html&#xff0c;v-if&#xff0c;v-for都是vue内置指令&#xff0c;而我们也可以封装自定义指令&#xff0c;提升编码效率。 什么是自定义指令&#xff1f; 自己定义的一些指令&#xff0c;可以进行一些dom操作&#xff0c;扩展格外的功能。比如让图片懒加载…

第七章:敏捷开发工具方法-part2-CI/CD工具介绍

文章目录 前言一、CI-持续集成1.1 安装部署gitlab 二、gitlab CI配置三、jenkins实现CI / CD3.1 安装jenkins3.2 配置CI3.3 配置CD3.4 其他构建方式1、定时构建2、指定参数构建3、webhook自动根据git事件进行构建 前言 什么是CI/Cd&#xff1f; CI-Continuous integration&…

web前端——简单的网页布局案列

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 目录 问题背景 解决样例 …

[Vue3 博物馆管理系统] 使用Vue3、Element-plus tabs组件构建选项卡功能

系列文章目录 第一章 定制上中下&#xff08;顶部菜单、底部区域、中间主区域显示&#xff09;三层结构首页 第二章 使用Vue3、Element-plus菜单组件构建菜单 第三章 使用Vue3、Element-plus走马灯组件构建轮播图 第四章 使用Vue3、Element-plus tabs组件构建选项卡功能 [第五…

Tomcat多实例和负载均衡动静分离

一、Tomcat多实例部署 安装jdk 设置jdk环境变量 安装tomcat 配置Tomcat环境变量 修改端口号 修改tomcat中startup.sh和shutdown.sh文件添加tomcat环境变量 启动Tomcat中的startup.sh 浏览器测试 http://192.168.30.100:8080 http://192.168.30.100:8081 二、负载均衡动静分离…

GPT 内部 — I : 了解文本生成

年轻的陀思妥耶夫斯基被介绍给生成AI&#xff0c;通过Midjourney创建 一、说明 我经常与不同领域的同事互动&#xff0c;我喜欢向几乎没有数据科学背景的人传达机器学习概念的挑战。在这里&#xff0c;我试图用简单的术语解释 GPT 是如何连接的&#xff0c;只是这次是书面形式。…

Elasticsearch:使用 ESRE 和生成式 AI 了解 TLS 日志错误

作者&#xff1a;DAVID HOPE 本博客介绍了 Elasticsearch 相关性引擎 (ESRE​​) 及其 Elastic Learned Sparse Encoder 功能的新颖应用&#xff0c;特别是在日志分析中。 最近发布的 Elasticsearch Relevance Engine™ (ESRE™) 包含一系列重要功能&#xff0c;可增强搜索能力…

2023移动软件开发实验5

2023年夏季《移动软件开发》实验报告 姓名和学号&#xff1f;本实验属于哪门课程&#xff1f;中国海洋大学23夏《移动软件开发》实验名称&#xff1f;实验5&#xff1a;高校新闻网博客地址&#xff1f;XXXXXXXGithub仓库地址&#xff1f;https://github.com/enfantsRichesDepr…

深入理解联邦学习——联邦学习的定义

分类目录&#xff1a;《深入理解联邦学习》总目录 假设有两个不同的企业 A A A和 B B B&#xff0c;它们拥有不同的数据。比如&#xff0c;企业 A A A有用户特征数据&#xff0c;而企业 B B B有产品特征数据和标注数据。这两个企业按照GDPR准则是不能粗暴地把双方数据加以合并的…