力扣算法题—073矩阵置零

力扣算法题—073矩阵置零

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

示例 1:

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

示例 2:

输入: 
[
  [0,1,2,0],
  [3,4,5,2],
  [1,3,1,5]
]
输出: 
[
  [0,0,0,0],
  [0,4,5,0],
  [0,3,1,0]
]

进阶:

  • 一个直接的解决方案是使用  O(mn) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个常数空间的解决方案吗?
 1 #include "_000库函数.h"
 2 
 3 
 4 //先使用m*n的额外空间
 5 class Solution {
 6 public:
 7     void setZeroes(vector<vector<int>>& matrix) {
 8         vector<vector<int>>temp = matrix;
 9         for (int i = 0; i < matrix.size(); ++i)
10             for (int j = 0; j < matrix[0].size(); ++j)
11                 if (temp[i][j] == 0) {
12                     for (int t = 0; t < matrix.size(); ++t)
13                         matrix[t][j] = 0;
14                     for (int t = 0; t < matrix[0].size(); ++t)
15                         matrix[i][t] = 0;
16                 }
17     }
18 };
19 
20 //使用m+n的额外空间,只需要记录的行和列就行
21 //此处可以再优化一下,不另外开辟空间,使用原矩阵的第一行和第一列来记录就行
22 class Solution {
23 public:
24     void setZeroes(vector<vector<int>>& matrix) {
25         vector<int>r(matrix.size(), 0);//行标记  m
26         vector<int>l(matrix[0].size(), 0);//列标记  n
27         for (int i = 0; i < matrix.size(); ++i)
28             for (int j = 0; j < matrix[0].size(); ++j)
29                 if (matrix[i][j] == 0) {
30                     r[i] = 1;
31                     l[j] = 1;
32                 }
33 
34         for (int i = 0; i < matrix.size(); ++i)
35             if (r[i])
36                 for (int j = 0; j < matrix[0].size(); ++j)
37                     matrix[i][j] = 0;
38 
39         for (int j = 0; j < matrix[0].size(); ++j)
40             if (l[j])
41                 for (int i = 0; i < matrix.size(); ++i)
42                     matrix[i][j] = 0;
43     }
44                     
45 };
46 void T073() {
47     Solution s;
48     vector<vector<int>>v;
49     v = { {
   1,1,1}, {
   1,0,1},{
   1,1,1} };
50     s.setZeroes(v);
51     for (auto &a : v) {
52         for (auto b : a)
53             cout << b << "  ";
54         cout << endl;
55     }
56     cout << endl;
57     v = { {
   0,1,2,0}, {
   3,4,5,2},{
   1,3,1,5} };
58     s.setZeroes(v);
59     for (auto &a : v) {
60         for (auto b : a)
61             cout << b << "  ";
62         cout << endl;
63     }
64     cout << endl;
65 
66 
67 }

 

转载于:https://www.cnblogs.com/zzw1024/p/10705526.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100984.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何在 Python 中使用断点调试

    如何在 Python 中使用断点调试实际上没人能一次就写出完美的代码,除了我。但是世界上只有一个我。–林纳斯·托瓦兹(Linux之父) 既然不是神,写代码自然免不了要修改。修改代码的过程被称作调试,又叫 debug。 刚接触编程的人,往往对调试代码没有很深的认识,觉得把功能做出来就完事了。一旦程序运行出现问题,便无从下手。而实际开发中,调试代码通常要花费比新编写代码更多的时间。所谓“行百里者半于九十”,这句…

    2022年5月21日
    44
  • 这 10 款良心 Windows 软件,改变你对国产的认知

    这 10 款良心 Windows 软件,改变你对国产的认知提起国产Windows软件,你可能首先想到的是捆绑安装、弹窗广告、卸载残留等关键词。尽管一些所谓「大厂」的确致力于拉低业界的下限,但依然有开发者坚守底线,为改变整个生态圈而默默努力。今天,少数派就

    2022年7月4日
    16
  • MySql必知必会实战练习(一)表创建和数据添加

    1.实战环境windows1064位mysql-8.0.13mysql编辑和查看工具:NaviCatforMySql表脚本文件:###########################

    2021年12月29日
    38
  • 科学计算编程语言_中国发明了什么编程语言

    科学计算编程语言_中国发明了什么编程语言本文是《打破国外垄断,开发中国人自己的编程语言》系列文章的第1篇。本系列文章的主要目的是教大家学会如何从零开始设计一种编程语言(marvel语言),并使用marvel语言开发一些真实的项目,如移动App、Web应用等。

    2022年10月5日
    1
  • idea安装mybatis插件_myeclipse安装插件

    idea安装mybatis插件_myeclipse安装插件选择Help->Installfromsite…在弹出的对话框中点击右上角的Add按钮Name:mybatisLocation:https://dl.bintray.com/mybatis/mybatis-generator

    2022年9月27日
    2
  • 编译成功了,运行为什么会失败_cython编译python

    编译成功了,运行为什么会失败_cython编译python编译caffe2遇到的坑最新的caffe2已经移到pytorch中去了,直接下载其中的代码然后按照官方教程就可以了。这里会遇到新的问题:make[3]:Enteringdirectory‘/home/ubuntu/caffe2-master/build’make[3]:Leavingdirectory‘/home/ubuntu/caffe2-master/build’…

    2025年6月23日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号