力扣算法题—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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

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