【每日一题】73. 矩阵置零

73. 矩阵置零 - 力扣(LeetCode)

给定一个 m x n 的矩阵,如果一个元素为 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法

示例 1:

输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]

示例 2:

输入: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]]

提示:

  • m == matrix.length
  • n == matrix[0].length
  • 1 <= m, n <= 200
  • -231 <= matrix[i][j] <= 231 - 1
没有使用原地算法的版本
class Solution {int x,y;ArrayList<Integer> arrx = new ArrayList();ArrayList<Integer> arry = new ArrayList();public void setZeroes(int[][] matrix) {int row = matrix.length;int col = matrix[0].length;for(int i = 0 ; i < row ; i++) {for(int j = 0 ; j < col ; j++) {if(matrix[i][j] == 0 ) {arrx.add(i);arry.add(j);}}}int len = arrx.size();for(int i = 0 ; i < len ; i++) {x = arrx.get(i);y = arry.get(i);process(matrix,row,col);}}public void process(int[][]matrix,int row,int col) {for(int i = 0 ; i < row ; i++)  matrix[i][y] = 0; for(int i = 0 ; i < col ; i++)  matrix[x][i] = 0;}
}
使用原地算法:
class Solution {int x , y ;public void setZeroes(int[][] matrix) {int row = matrix.length;int col = matrix[0].length;for(int i = 0 ; i < row ; ++i) {for(int j = 0 ; j < col ; ++j) {if(matrix[i][j] == 0 ) {x = i ;y = j ;process(matrix,row,col);}}}for(int i = 0 ; i < row ; ++i) {for(int j = 0; j < col ; ++j) {if(matrix[i][j] == '*')  matrix[i][j] = 0;}}}public void process(int[][]matrix,int row,int col) {for(int i = 0 ; i < row ; i++)  {if(matrix[i][y] != 0)matrix[i][y] = '*'; }for(int i = 0 ; i < col ; i++)  {if(matrix[x][i] != 0)matrix[x][i] = '*';}}
}

 今天也是一道中等题。

        首先可能需要说一下原地算法。原地算法_百度百科 (baidu.com)

        在计算机科学中,一个原地算法(in-place algorithm)是一种使用小的,固定数量的额外之空间来转换资料的算法。当算法执行时,输入的资料通常会被要输出的部分覆盖掉。不是原地算法有时候称为非原地(not-in-place)或不得其所(out-of-place)。

       实际上也就是名称很唬人,实际上就是叫你使用O(1)的空间复杂度来完成解答。

现在进入第一个代码的解析:

        根据题目,就是将一个位置是0的行和列都置0。这里要思考到一个问题,你修改的东西会不会影响到后面的if判断,这个对之后很多题目都可能有帮助。如果你一开始遇到一个位置是0的,就先把行和列都转换了。那么在循环进行到后面位置的时候就会出现原本不是0的位置被判断成为0,出现很多原本不应该转换的被转换。所以博主这里用了两个arraylist来存储每个需要改变的位置,所有需要改的位置都找到之后,再针对arraylist里面的方位进行改变。

第二个代码解析:

        这个代码使用了原地算法,可以发现,除了使用x,y,没有在开辟其他变量。而实际的思路跟第一个代码也是差不多的,可以先使用一个标记在原数组中标记需要改变的位置。在循环玩数组之后,就可以对每个需要改变位置的行列进行处理。

当然也可以去看看题解,题解实际上的思路也差不多。最后一个思路会从矩阵最后开始处理。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux内核4.14版本——drm框架分析(11)——DRM_IOCTL_MODE_ADDFB2(drm_mode_addfb2)

目录 1. drm_mode_addfb2 2. drm_internal_framebuffer_create 3. drm_fb_cma_create->drm_gem_fb_create->drm_gem_fb_create_with_funcs 4. drm_gem_fb_alloc 4.1 drm_helper_mode_fill_fb_struct 4.2 drm_framebuffer_init 5. 调用流程图 书接上回&#xff0c;使…

day6_C++

day6_C 模板 栈模板 队列思维导图 模板 栈 stack.h #ifndef STACK_H #define STACK_H#include <iostream> #include <cstring>using namespace std;#define MAX 5template<typename T> class Stack { public:/*构造函数*/Stack();/*拷贝构造函数*/Stack(co…

chrome插件:一个基于webpack + react的chrome 插件项目模板

项目结构 $ tree -L 1 . ├── README.md ├── node_modules # npm依赖 ├── package.json # 详细依赖 ├── pnpm-lock.yaml ├── public # 里边包含dist&#xff0c;安装的时候安装这个目录即可 ├── src …

Swift学习内容精选(二)

Swift 类是构建代码所用的一种通用且灵活的构造体。 我们可以为类定义属性&#xff08;常量、变量&#xff09;和方法。 与其他编程语言所不同的是&#xff0c;Swift 并不要求你为自定义类去创建独立的接口和实现文件。你所要做的是在一个单一文件中定义一个类&#xff0c;系…

GO语言网络编程(并发编程)Channel

GO语言网络编程&#xff08;并发编程&#xff09;Channel 1、Channel 1.1.1 Channel 单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。 虽然可以使用共享内存进行数据交换&#xff0c;但是共享内存在不同的goroutine中容易发生竞态…

Go 常量为什么只支持基本数据类型?

大家好&#xff0c;我是煎鱼。 相信大家在接触 Go 这门编程语言时&#xff0c;就会学到常量这个知识点。 各大编程语言会教你&#xff0c;常量是不可变变量的一种类型。只要定义了常量&#xff0c;你就可以安心的用他。不用担心值在哪里就被程序莫名奇妙的给改了。 常量的使用例…

Adobe Acrobat Reader界面改版 - 解决方案

问题 日期&#xff1a;2023年9月 Adobe Acrobat Reader下文简称Adobe PDF Reader&#xff0c;此软件会自动进行更新&#xff0c;当版本更新至2023.003.20284版本后。 软件UI界面会大改版&#xff1a;书签页变成了右边、工具栏变到了左边、缩放按钮变到了右下角&#xff0c;如…

Linux如何安装MySQL

Linux安装MySQL5.7 1、下载 官网下载地址&#xff1a;http://dev.mysql.com/downloads/mysql/ 2、复制下面几个文件 3、检查当前系统是否安装过mysql、检查当前mysql依赖环境、检查/tmp文件夹权限 1&#xff09;检查当前系统是否安装过mysql&#xff0c;执行安装命令前&am…

4.zigbee开发,传感器网络管理进阶(网状和树状拓扑),zigbee的ADC

一。zigbee的串口 1.串口通信的基本概念 &#xff08;1&#xff09;同步通信与异步通信 同步通信&#xff1a; 一般情况下同步通信指的是通信双方根据同步信号进行通信的方式。比如通信双方有一个共同的时钟信号&#xff0c;通讯中通常双方会统一规定在时钟信号的上升沿…

核心实验21_BGP高级(了解)(配置略)_ENSP

项目场景&#xff1a; 核心实验21_BGP基础_ENSP 通过bgp实现省市互通。 实搭拓扑图&#xff1a; 具体操作&#xff1a; 其他基础配置略&#xff08;接口地址&#xff0c;ospf&#xff09; 1.BGP邻居建立&#xff1a; R1: [R1]bgp 200 [R1-bgp]peer 10.2.2.2 as-number 200 …

USB接口针式打印机

1 针式打印机原理 - 针式打印机16针是纵向排列&#xff0c;每次打印垂直的16bit&#xff0c;然后右移一bit&#xff0c;继续下列打印&#xff1b;字节的MSB表示最上面的点&#xff0c;字节LSB表示最下面的点 - 由于汉字字模的点阵是横向排列的&#xff0c;而提供给打印头的信息…

【PHY】3GPP UE能力类别的变化

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…