-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProblem_01.08_setZeroes.cc
180 lines (164 loc) · 3.71 KB
/
Problem_01.08_setZeroes.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#include <iostream>
#include <vector>
#include "UnitTest.h"
using namespace std;
using TdArray = vector<vector<int>>;
class Solution
{
public:
// 思路:
// 如果不考虑限制
// vector<bool> row(m)
// vector<bool> col(n)
// 可以用两个数组标记哪行、哪列需要清0
//
// 考虑限制,就可以在原二维数组上取第0行、第0列代替row、col数组
// 需要注意的是,第0行、第0列本身存在的0需要提前考虑
void setZeroes1(vector<vector<int>> &matrix)
{
bool row = false;
bool col = false;
for (int i = 0; i < matrix.size(); i++)
{
if (matrix[i][0] == 0)
{
col = true;
break;
}
}
for (int i = 0; i < matrix[0].size(); i++)
{
if (matrix[0][i] == 0)
{
row = true;
break;
}
}
for (int i = 1; i < matrix.size(); i++)
{
for (int j = 1; j < matrix[0].size(); j++)
{
if (matrix[i][j] == 0)
{
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for (int i = 1; i < matrix.size(); i++)
{
for (int j = 1; j < matrix[0].size(); j++)
{
if (matrix[0][j] == 0 || matrix[i][0] == 0)
{
matrix[i][j] = 0;
}
}
}
if (col)
{
for (int i = 0; i < matrix.size(); i++)
{
matrix[i][0] = 0;
}
}
if (row)
{
for (int i = 0; i < matrix[0].size(); i++)
{
matrix[0][i] = 0;
}
}
}
// 优化
void setZeroes2(vector<vector<int>> &matrix)
{
// 第0列的数,表示行要不要清0
// 其他列的数,表示列要不要清0
bool col = false;
for (int i = 0; i < matrix.size(); i++)
{
for (int j = 0; j < matrix[0].size(); j++)
{
if (matrix[i][j] == 0)
{
matrix[i][0] = 0;
if (j == 0)
{
// 说明第0列存在0,后续需要把第0列清0
col = true;
}
else
{
// matrix[0][0] 表示第0行要不要清0,第0列要不要清0由col表示
// 不能破坏第0行的规则
matrix[0][j] = 0;
}
}
}
}
// 最后才清空第一行
for (int i = matrix.size() - 1; i >= 0; i++)
{
for (int j = 1; j < matrix[0].size(); j++)
{
if (matrix[i][0] == 0 || matrix[0][j] == 0)
{
matrix[i][j] = 0;
}
}
}
if (col)
{
for (int i = 0; i < matrix.size(); i++)
{
matrix[i][0] = 0;
}
}
}
};
bool isTdArrayEqual(TdArray a, TdArray b)
{
for (int i = 0; i < a.size(); i++)
{
for (int j = 0; j < b.size(); j++)
{
if (a[i][j] != b[i][j])
{
return false;
}
}
}
return true;
}
void testSetZeroes()
{
Solution s;
TdArray in1 = {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}};
TdArray out1 = {{1, 0, 1}, {0, 0, 0}, {1, 0, 1}};
TdArray in2 = {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}};
TdArray out2 = {{1, 0, 1}, {0, 0, 0}, {1, 0, 1}};
TdArray in3 = {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}};
TdArray out3 = {{1, 0, 1}, {0, 0, 0}, {1, 0, 1}};
s.setZeroes1(in1);
s.setZeroes1(in2);
s.setZeroes1(in3);
EXPECT_TRUE(isTdArrayEqual(out1, in1));
EXPECT_TRUE(isTdArrayEqual(out2, in2));
EXPECT_TRUE(isTdArrayEqual(out3, in3));
TdArray in4 = {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}};
TdArray in5 = {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}};
TdArray in6 = {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}};
s.setZeroes2(in4);
s.setZeroes2(in5);
s.setZeroes2(in6);
EXPECT_TRUE(isTdArrayEqual(out1, in4));
EXPECT_TRUE(isTdArrayEqual(out2, in5));
EXPECT_TRUE(isTdArrayEqual(out3, in6));
EXPECT_SUMMARY;
}
int main()
{
testSetZeroes();
return 0;
}