当前位置: 首页 > article >正文

力扣每日一题73:矩阵置零

题目描述:

给定一个 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

进阶:

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

通过次数

286.9K

提交次数

446.4K

通过率

64.3%

思路和题解:

一、先遍历一次矩阵,用一个数组row和一个数组col标记要置零的行和列,随后再遍历一次矩阵,如果矩阵所在行或列要置0,那就变零。时间复杂度O(m*n),空间复杂度O(m+n)

代码:

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m=matrix.size();
        int n=matrix[0].size();
        //记录要置零的行和列
        vector<int> row(m,0);
        vector<int> col(n,0);
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
                if(matrix[i][j]==0)
                    row[i]=col[j]=1;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
                if(row[i]==1||col[j]==1)
                    matrix[i][j]=0;
    }
};

二、方法一的改进,矩阵的第一行和第一列代替col和row,实现O(1)空间复杂度,但矩阵的第一行和第一列有交叉,交叉的位置既要标记第一行是否出现零,又要标记第一列是否出现零,所以我们应该额外设置一个变量flag,flag与matrix[0][0]一个标记第一行是否出现零,一个标记第一列是否出现零。

代码:

lass Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m=matrix.size();
        int n=matrix[0].size();
        bool flag_col0=false;
        //标记
        for(int i=0;i<m;i++)
        {
            if(matrix[i][0]==0) flag_col0=true;
            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(matrix[0][0]==0)
            for(int j=0;j<n;j++) matrix[0][j]=0;
        if(flag_col0==true)
            for(int j=0;j<m;j++) matrix[j][0]=0;
    }
};


http://www.kler.cn/a/107067.html

相关文章:

  • L10.【LeetCode笔记】回文链表
  • 重构代码之内联临时变量
  • 网页web无插件播放器EasyPlayer.js点播播放器遇到视频地址播放不了的现象及措施
  • 字节跳动核心技术:TT推荐系统从0-1落地应用
  • GitLab实现 HTTP 访问和 SMTP 邮件发送
  • https网站 请求http图片报错:net::ERR_SSL_PROTOCOL_ERROR
  • 2023CSP-J题解
  • python 字典dict和列表list的读取速度问题, range合并
  • 笔记-《RabbitMQ实战指南》
  • Oracle 数据库的锁排查方法
  • Linux 系统调用IO口,利用光标偏移实现文件复制
  • Kotlin 使用@BindingAdapter编译出错
  • 【微服务开篇-RestTemplate服务调用、Eureka注册中心、Nacos注册中心】
  • VPS是什么?详解亚马逊云科技Amazon Lightsail(VPS)虚拟专用服务器
  • C++模拟实现-----日期计算器(超详细解析,小白一看就会!)
  • Java架构师内功计算机网络
  • LVS集群-DR模式【部署高可用LVS-DR集群】
  • Java SE 学习笔记(十四)—— IO流(3)
  • Java 反射机制详解
  • SQL server中:常见问题汇总(如:修改表时不允许修改表结构、将截断字符串或二进制数据等)
  • 【计算机网络】HTTPS 的加密流程
  • linux--
  • 简易但很实用的javaswing/gui音乐播放器
  • vscode C++项目相对路径的问题
  • Redis快速上手篇(六)主从复制
  • myTracks for Mac:GPS轨迹记录器的强大与便捷