Skip to content

Commit 9239a8c

Browse files
committed
feat: add solutions to lc problem: No.1253
No.1253.Reconstruct a 2-Row Binary Matrix
1 parent e998e4e commit 9239a8c

File tree

6 files changed

+372
-2
lines changed

6 files changed

+372
-2
lines changed

solution/1200-1299/1253.Reconstruct a 2-Row Binary Matrix/README.md

Lines changed: 137 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,22 +56,158 @@
5656

5757
<!-- 这里可写通用的实现逻辑 -->
5858

59+
**方法一:贪心**
60+
61+
我们先创建一个答案数组 `ans`,其中 `ans[0]``ans[1]` 分别表示第 $0$ 行和第 $1$ 行的元素。
62+
63+
对于 `colsum` 中的每个元素 $v$:
64+
65+
- 如果 $v = 2$,那么我们将 `ans[0][j]``ans[1][j]` 都置为 $1$,其中 $j$ 是当前元素的下标。此时 `upper``lower` 都减去 $1$。
66+
- 如果 $v = 1$,那么我们将 `ans[0][j]``ans[1][j]` 置为 $1$,其中 $j$ 是当前元素的下标。如果 `upper` 大于 `lower`,那么我们优先将 `ans[0][j]` 置为 $1$,否则我们优先将 `ans[1][j]` 置为 $1$。此时 `upper``lower` 减去 $1$。
67+
- 如果 $v = 0$,那么我们将 `ans[0][j]``ans[1][j]` 都置为 $0$,其中 $j$ 是当前元素的下标。
68+
- 如果 `upper``lower` 小于 $0$,那么我们直接返回一个空数组。
69+
70+
遍历完 `colsum` 后,如果 `upper``lower` 都为 $0$,那么我们返回 `ans`,否则我们返回一个空数组。
71+
72+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是 `colsum` 的长度。
73+
5974
<!-- tabs:start -->
6075

6176
### **Python3**
6277

6378
<!-- 这里可写当前语言的特殊实现逻辑 -->
6479

6580
```python
66-
81+
class Solution:
82+
def reconstructMatrix(self, upper: int, lower: int, colsum: List[int]) -> List[List[int]]:
83+
n = len(colsum)
84+
ans = [[0] * n for _ in range(2)]
85+
for j, v in enumerate(colsum):
86+
if v == 2:
87+
ans[0][j] = ans[1][j] = 1
88+
upper, lower = upper - 1, lower - 1
89+
if v == 1:
90+
if upper > lower:
91+
upper -= 1
92+
ans[0][j] = 1
93+
else:
94+
lower -= 1
95+
ans[1][j] = 1
96+
if upper < 0 or lower < 0:
97+
return []
98+
return ans if lower == upper == 0 else []
6799
```
68100

69101
### **Java**
70102

71103
<!-- 这里可写当前语言的特殊实现逻辑 -->
72104

73105
```java
106+
class Solution {
107+
public List<List<Integer>> reconstructMatrix(int upper, int lower, int[] colsum) {
108+
int n = colsum.length;
109+
List<List<Integer>> ans = new ArrayList<>();
110+
List<Integer> first = new ArrayList<>();
111+
List<Integer> second = new ArrayList<>();
112+
for (int j = 0; j < n; ++j) {
113+
if (colsum[j] == 2) {
114+
first.add(1);
115+
second.add(1);
116+
upper--;
117+
lower--;
118+
} else if (colsum[j] == 1) {
119+
if (upper > lower) {
120+
upper--;
121+
first.add(1);
122+
second.add(0);
123+
} else {
124+
lower--;
125+
first.add(0);
126+
second.add(1);
127+
}
128+
} else {
129+
first.add(0);
130+
second.add(0);
131+
}
132+
if (upper < 0 || lower < 0) {
133+
return ans;
134+
}
135+
}
136+
if (upper != 0 || lower != 0) {
137+
return ans;
138+
}
139+
ans.add(first);
140+
ans.add(second);
141+
return ans;
142+
}
143+
}
144+
```
145+
146+
### **C++**
147+
148+
```cpp
149+
class Solution {
150+
public:
151+
vector<vector<int>> reconstructMatrix(int upper, int lower, vector<int>& colsum) {
152+
int n = colsum.size();
153+
vector<vector<int>> ans(2, vector<int>(n));
154+
for (int j = 0; j < n; ++j) {
155+
if (colsum[j] == 2) {
156+
ans[0][j] = ans[1][j] = 1;
157+
upper--;
158+
lower--;
159+
}
160+
if (colsum[j] == 1) {
161+
if (upper > lower) {
162+
upper--;
163+
ans[0][j] = 1;
164+
} else {
165+
lower--;
166+
ans[1][j] = 1;
167+
}
168+
}
169+
if (upper < 0 || lower < 0) {
170+
return {};
171+
}
172+
}
173+
return upper != 0 || lower != 0 ? vector<vector<int>>{} : ans;
174+
}
175+
};
176+
```
74177
178+
### **Go**
179+
180+
```go
181+
func reconstructMatrix(upper int, lower int, colsum []int) [][]int {
182+
n := len(colsum)
183+
ans := make([][]int, 2)
184+
for i := range ans {
185+
ans[i] = make([]int, n)
186+
}
187+
for j, v := range colsum {
188+
if v == 2 {
189+
ans[0][j], ans[1][j] = 1, 1
190+
upper--
191+
lower--
192+
}
193+
if v == 1 {
194+
if upper > lower {
195+
upper--
196+
ans[0][j] = 1
197+
} else {
198+
lower--
199+
ans[1][j] = 1
200+
}
201+
}
202+
if upper < 0 || lower < 0 {
203+
return [][]int{}
204+
}
205+
}
206+
if upper != 0 || lower != 0 {
207+
return [][]int{}
208+
}
209+
return ans
210+
}
75211
```
76212

77213
### **...**

solution/1200-1299/1253.Reconstruct a 2-Row Binary Matrix/README_EN.md

Lines changed: 122 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,134 @@
6060
### **Python3**
6161

6262
```python
63-
63+
class Solution:
64+
def reconstructMatrix(self, upper: int, lower: int, colsum: List[int]) -> List[List[int]]:
65+
n = len(colsum)
66+
ans = [[0] * n for _ in range(2)]
67+
for j, v in enumerate(colsum):
68+
if v == 2:
69+
ans[0][j] = ans[1][j] = 1
70+
upper, lower = upper - 1, lower - 1
71+
if v == 1:
72+
if upper > lower:
73+
upper -= 1
74+
ans[0][j] = 1
75+
else:
76+
lower -= 1
77+
ans[1][j] = 1
78+
if upper < 0 or lower < 0:
79+
return []
80+
return ans if lower == upper == 0 else []
6481
```
6582

6683
### **Java**
6784

6885
```java
86+
class Solution {
87+
public List<List<Integer>> reconstructMatrix(int upper, int lower, int[] colsum) {
88+
int n = colsum.length;
89+
List<List<Integer>> ans = new ArrayList<>();
90+
List<Integer> first = new ArrayList<>();
91+
List<Integer> second = new ArrayList<>();
92+
for (int j = 0; j < n; ++j) {
93+
if (colsum[j] == 2) {
94+
first.add(1);
95+
second.add(1);
96+
upper--;
97+
lower--;
98+
} else if (colsum[j] == 1) {
99+
if (upper > lower) {
100+
upper--;
101+
first.add(1);
102+
second.add(0);
103+
} else {
104+
lower--;
105+
first.add(0);
106+
second.add(1);
107+
}
108+
} else {
109+
first.add(0);
110+
second.add(0);
111+
}
112+
if (upper < 0 || lower < 0) {
113+
return ans;
114+
}
115+
}
116+
if (upper != 0 || lower != 0) {
117+
return ans;
118+
}
119+
ans.add(first);
120+
ans.add(second);
121+
return ans;
122+
}
123+
}
124+
```
125+
126+
### **C++**
127+
128+
```cpp
129+
class Solution {
130+
public:
131+
vector<vector<int>> reconstructMatrix(int upper, int lower, vector<int>& colsum) {
132+
int n = colsum.size();
133+
vector<vector<int>> ans(2, vector<int>(n));
134+
for (int j = 0; j < n; ++j) {
135+
if (colsum[j] == 2) {
136+
ans[0][j] = ans[1][j] = 1;
137+
upper--;
138+
lower--;
139+
}
140+
if (colsum[j] == 1) {
141+
if (upper > lower) {
142+
upper--;
143+
ans[0][j] = 1;
144+
} else {
145+
lower--;
146+
ans[1][j] = 1;
147+
}
148+
}
149+
if (upper < 0 || lower < 0) {
150+
return {};
151+
}
152+
}
153+
return upper != 0 || lower != 0 ? vector<vector<int>>{} : ans;
154+
}
155+
};
156+
```
69157
158+
### **Go**
159+
160+
```go
161+
func reconstructMatrix(upper int, lower int, colsum []int) [][]int {
162+
n := len(colsum)
163+
ans := make([][]int, 2)
164+
for i := range ans {
165+
ans[i] = make([]int, n)
166+
}
167+
for j, v := range colsum {
168+
if v == 2 {
169+
ans[0][j], ans[1][j] = 1, 1
170+
upper--
171+
lower--
172+
}
173+
if v == 1 {
174+
if upper > lower {
175+
upper--
176+
ans[0][j] = 1
177+
} else {
178+
lower--
179+
ans[1][j] = 1
180+
}
181+
}
182+
if upper < 0 || lower < 0 {
183+
return [][]int{}
184+
}
185+
}
186+
if upper != 0 || lower != 0 {
187+
return [][]int{}
188+
}
189+
return ans
190+
}
70191
```
71192

72193
### **...**
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
public:
3+
vector<vector<int>> reconstructMatrix(int upper, int lower, vector<int>& colsum) {
4+
int n = colsum.size();
5+
vector<vector<int>> ans(2, vector<int>(n));
6+
for (int j = 0; j < n; ++j) {
7+
if (colsum[j] == 2) {
8+
ans[0][j] = ans[1][j] = 1;
9+
upper--;
10+
lower--;
11+
}
12+
if (colsum[j] == 1) {
13+
if (upper > lower) {
14+
upper--;
15+
ans[0][j] = 1;
16+
} else {
17+
lower--;
18+
ans[1][j] = 1;
19+
}
20+
}
21+
if (upper < 0 || lower < 0) {
22+
return {};
23+
}
24+
}
25+
return upper != 0 || lower != 0 ? vector<vector<int>>{} : ans;
26+
}
27+
};
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
func reconstructMatrix(upper int, lower int, colsum []int) [][]int {
2+
n := len(colsum)
3+
ans := make([][]int, 2)
4+
for i := range ans {
5+
ans[i] = make([]int, n)
6+
}
7+
for j, v := range colsum {
8+
if v == 2 {
9+
ans[0][j], ans[1][j] = 1, 1
10+
upper--
11+
lower--
12+
}
13+
if v == 1 {
14+
if upper > lower {
15+
upper--
16+
ans[0][j] = 1
17+
} else {
18+
lower--
19+
ans[1][j] = 1
20+
}
21+
}
22+
if upper < 0 || lower < 0 {
23+
return [][]int{}
24+
}
25+
}
26+
if upper != 0 || lower != 0 {
27+
return [][]int{}
28+
}
29+
return ans
30+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
class Solution {
2+
public List<List<Integer>> reconstructMatrix(int upper, int lower, int[] colsum) {
3+
int n = colsum.length;
4+
List<List<Integer>> ans = new ArrayList<>();
5+
List<Integer> first = new ArrayList<>();
6+
List<Integer> second = new ArrayList<>();
7+
for (int j = 0; j < n; ++j) {
8+
if (colsum[j] == 2) {
9+
first.add(1);
10+
second.add(1);
11+
upper--;
12+
lower--;
13+
} else if (colsum[j] == 1) {
14+
if (upper > lower) {
15+
upper--;
16+
first.add(1);
17+
second.add(0);
18+
} else {
19+
lower--;
20+
first.add(0);
21+
second.add(1);
22+
}
23+
} else {
24+
first.add(0);
25+
second.add(0);
26+
}
27+
if (upper < 0 || lower < 0) {
28+
return ans;
29+
}
30+
}
31+
if (upper != 0 || lower != 0) {
32+
return ans;
33+
}
34+
ans.add(first);
35+
ans.add(second);
36+
return ans;
37+
}
38+
}

0 commit comments

Comments
 (0)