力扣算法题—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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 无人驾驶汽车系统入门(一)——卡尔曼滤波与目标追踪

    无人驾驶汽车系统入门(一)——卡尔曼滤波与目标追踪前言:随着深度学习近几年来的突破性进展,无人驾驶汽车也在这些年开始不断向商用化推进。很显然,无人驾驶汽车已经不是遥不可及的“未来技术”了,未来10年必将成为一个巨大的市场。本系列博客将围绕当前使用的最先进的无人驾驶汽车相关技术,一步一步地带领大家学习并且掌握无人驾驶系统的每一个模块的理论基础和实现细节。由于无人驾驶汽车系统构成及其复杂,本系列博客仅讨论软件部分的内容,关于汽车,传感器和底层的硬件,不

    2022年6月18日
    25
  • JAVA lambda表达式_java lambda表达式原理

    JAVA lambda表达式_java lambda表达式原理原文链接:StartUsingJavaLambdaExpressions下载示例程序Examples.zip。原文日期:2014年4月16日翻译日期:2014年4月27日翻译人员:铁锚简介(译者认为:超过3行的逻辑就不适用Lambda表达式了。虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用…

    2022年9月19日
    0
  • Cts框架解析(12)-ITargetPreparer

    Cts框架解析(12)-ITargetPreparer

    2022年2月4日
    49
  • python字符串查找特定字符_神器是啥意思

    python字符串查找特定字符_神器是啥意思TheFuzz库对应的源码链接为https://github.com/seatgeek/thefuzz。需要说明的是,TheFuzz是FuzzyWuzzy的升级版本,后者在2020年后已经不再进行更新,所以请及时切换到TheFuzz库。1.安装方法2.两大模块fuzz和process2.1模块一:fuzz2.2模块二:process2.2.1process.extractOne(提取出相似度最高的选择)2.2.2process.extract(提取出相似度高的多个选择)3.实战案例

    2022年8月21日
    4
  • 使用use index优化sql查询「建议收藏」

    使用use index优化sql查询

    2022年2月17日
    31
  • HTML5 FormData 方法介绍以及实现文件上传

    HTML5 FormData 方法介绍以及实现文件上传本文介绍了XMLHttpRequestLevel2中的FormData接口,利用FormData我们可以轻松的实现文件上传,FormData对象还有一些实用的方法,本文也对其一一进行了解释。

    2022年10月25日
    0

发表回复

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

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