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


相关推荐

  • kafka集群搭建及简单使用

    kafka集群搭建及简单使用KafkaKafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Li…

    2022年6月10日
    36
  • Http状态码406(Not Acceptable) 错误问题解决方法

    Http状态码406(Not Acceptable) 错误问题解决方法状态码406:HTTP协议状态码的一种,表示无法使用请求的内容特性来响应请求的网页。说白了就是后台的返回结果前台无法解析就报406错误。示例代码中请求代码,后台代码均正常,且有返回信息。如下图:$.ajax({url:’http://localhost:8080/findDsrwByDsrwid’,type:’post’,…

    2022年6月16日
    221
  • 缓存雪崩、击穿、穿透,该如何避免?[通俗易懂]

    缓存雪崩、击穿、穿透,该如何避免?

    2022年2月12日
    38
  • Redis 集群搭建

    Redis集群搭建前言最近通过看视频学习了一下Redis,前天使用CentOS7配置了一下Redis4.0.9单机版(相关链接:CentOS7配置Redis4.0.9),今天则通过之前的笔记,视频以及redis官网上集群搭建的教程(https://redis.io/topics/cluster-tutorial)的资料来搭建一下Redis集群。…

    2022年4月7日
    36
  • animate.css 官方,animateCSS

    animate.css 官方,animateCSSanimateCSS是什么什么是animateCSS,AnimateCSSjQueryPluginanimateCSS官网:官网animateCSS文档:文档animateCSS源码仓库:源码仓库animateCSS下载地址:点此下载点此下载2animateCSS介绍、animateCSS使用AjQueryplugintodynamicallyapplyDanEden’sa…

    2022年7月27日
    6
  • Java 链表结点插入

    Java 链表结点插入PS:链表是一种数据结构,而数据结构就是一种存放数据的方式。为什么需要链表?我们知道,数组也可以存储数据,那么为什么还需要链表呢?接下来,我们来看看数组和链表的区别:1、数组就像身上编了号站成一排的人,要找第10个人很容易,根据人身上的编号很快就能找到。但插入、删除慢,要往某个位置插入或删除一个人时,后面的人身上的编号都要变。当然,加入或删除的人始终末尾的也快。2、链表就…

    2022年4月30日
    42

发表回复

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

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