Skip to content

Commit 225e022

Browse files
authored
feat: add solutions to lc problem: No.2128 (doocs#1288)
No.2128.Remove All Ones With Row and Column Flips
1 parent d9b96ad commit 225e022

File tree

8 files changed

+230
-6
lines changed

8 files changed

+230
-6
lines changed

solution/1000-1099/1072.Flip Columns For Maximum Number of Equal Rows/README.md

+4
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@
7373

7474
时间复杂度 $O(m \times n)$,空间复杂度 $O(m)$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
7575

76+
相似题目:
77+
78+
- [2128. 通过翻转行或列来去除所有的 1](/solution/2100-2199/2128.Remove%20All%20Ones%20With%20Row%20and%20Column%20Flips/README.md)
79+
7680
<!-- tabs:start -->
7781

7882
### **Python3**

solution/2100-2199/2128.Remove All Ones With Row and Column Flips/README.md

+93-4
Original file line numberDiff line numberDiff line change
@@ -52,30 +52,119 @@
5252

5353
<!-- 这里可写通用的实现逻辑 -->
5454

55+
**方法一:哈希表**
56+
57+
我们观察发现,如果矩阵中的两行满足以下条件之一,则它们可以通过翻转某些列的方式得到相等的行:
58+
59+
1. 两行的对应位置元素相等,即如果其中一行元素为 $1,0,0,1$,则另一行元素也为 $1,0,0,1$;
60+
1. 两行的对应位置元素相反,即如果其中一行元素为 $1,0,0,1$,则另一行元素为 $0,1,1,0$。
61+
62+
我们称满足以上条件之一的两行元素为“等价行”,那么题目所求的答案即为矩阵中最多包含等价行的行数。
63+
64+
因此,我们可以遍历矩阵的每一行,将每一行转换成第一个元素为 $0$ 的“等价行”。具体做法如下:
65+
66+
- 如果当前行的第一个元素为 $0$,那么当前行的元素保持不变;
67+
- 如果当前行的第一个元素为 $1$,那么我们将当前行的每个元素进行翻转,即 $0$ 变成 $1$, $1$ 变成 $0$。也就是说,我们将以 $1$ 开头的行翻转成以 $0$ 开头的“等价行”。
68+
69+
这样一来,我们只需要用一个哈希表来统计转换后的每一行,如果最后哈希表只有一个元素,那么说明我们可以通过翻转行或列,将矩阵中所有的 $1$ 去除。
70+
71+
时间复杂度 $O(m \times n)$,空间复杂度 $O(m)$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
72+
73+
相似题目:
74+
75+
- [1072. 按列翻转得到最大值等行数](/solution/1000-1099/1072.Flip%20Columns%20For%20Maximum%20Number%20of%20Equal%20Rows/README.md)
76+
5577
<!-- tabs:start -->
5678

5779
### **Python3**
5880

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

6183
```python
62-
84+
class Solution:
85+
def removeOnes(self, grid: List[List[int]]) -> bool:
86+
s = set()
87+
for row in grid:
88+
t = tuple(row) if row[0] == grid[0][0] else tuple(x ^ 1 for x in row)
89+
s.add(t)
90+
return len(s) == 1
6391
```
6492

6593
### **Java**
6694

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

6997
```java
98+
class Solution {
99+
public boolean removeOnes(int[][] grid) {
100+
Set<String> s = new HashSet<>();
101+
int n = grid[0].length;
102+
for (var row : grid) {
103+
var cs = new char[n];
104+
for (int i = 0; i < n; ++i) {
105+
cs[i] = (char) (row[0] ^ row[i]);
106+
}
107+
s.add(String.valueOf(cs));
108+
}
109+
return s.size() == 1;
110+
}
111+
}
112+
```
70113

114+
### **C++**
115+
116+
```cpp
117+
class Solution {
118+
public:
119+
bool removeOnes(vector<vector<int>>& grid) {
120+
unordered_set<string> s;
121+
for (auto& row : grid) {
122+
string t;
123+
for (int x : row) {
124+
t.push_back('0' + (row[0] == 0 ? x : x ^ 1));
125+
}
126+
s.insert(t);
127+
}
128+
return s.size() == 1;
129+
}
130+
};
71131
```
72132
73-
### **TypeScript**
133+
### **Go**
134+
135+
```go
136+
func removeOnes(grid [][]int) bool {
137+
s := map[string]bool{}
138+
for _, row := range grid {
139+
t := []byte{}
140+
for _, x := range row {
141+
if row[0] == 1 {
142+
x ^= 1
143+
}
144+
t = append(t, byte(x)+'0')
145+
}
146+
s[string(t)] = true
147+
}
148+
return len(s) == 1
149+
}
150+
```
74151

75-
<!-- 这里可写当前语言的特殊实现逻辑 -->
152+
### **TypeScript**
76153

77154
```ts
78-
155+
function removeOnes(grid: number[][]): boolean {
156+
const s = new Set<string>();
157+
for (const row of grid) {
158+
if (row[0] === 1) {
159+
for (let i = 0; i < row.length; i++) {
160+
row[i] ^= 1;
161+
}
162+
}
163+
const t = row.join('');
164+
s.add(t);
165+
}
166+
return s.size === 1;
167+
}
79168
```
80169

81170
### **...**

solution/2100-2199/2128.Remove All Ones With Row and Column Flips/README_EN.md

+71-2
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,88 @@
5454
### **Python3**
5555

5656
```python
57-
57+
class Solution:
58+
def removeOnes(self, grid: List[List[int]]) -> bool:
59+
s = set()
60+
for row in grid:
61+
t = tuple(row) if row[0] == grid[0][0] else tuple(x ^ 1 for x in row)
62+
s.add(t)
63+
return len(s) == 1
5864
```
5965

6066
### **Java**
6167

6268
```java
69+
class Solution {
70+
public boolean removeOnes(int[][] grid) {
71+
Set<String> s = new HashSet<>();
72+
int n = grid[0].length;
73+
for (var row : grid) {
74+
var cs = new char[n];
75+
for (int i = 0; i < n; ++i) {
76+
cs[i] = (char) (row[0] ^ row[i]);
77+
}
78+
s.add(String.valueOf(cs));
79+
}
80+
return s.size() == 1;
81+
}
82+
}
83+
```
6384

85+
### **C++**
86+
87+
```cpp
88+
class Solution {
89+
public:
90+
bool removeOnes(vector<vector<int>>& grid) {
91+
unordered_set<string> s;
92+
for (auto& row : grid) {
93+
string t;
94+
for (int x : row) {
95+
t.push_back('0' + (row[0] == 0 ? x : x ^ 1));
96+
}
97+
s.insert(t);
98+
}
99+
return s.size() == 1;
100+
}
101+
};
102+
```
103+
104+
### **Go**
105+
106+
```go
107+
func removeOnes(grid [][]int) bool {
108+
s := map[string]bool{}
109+
for _, row := range grid {
110+
t := []byte{}
111+
for _, x := range row {
112+
if row[0] == 1 {
113+
x ^= 1
114+
}
115+
t = append(t, byte(x)+'0')
116+
}
117+
s[string(t)] = true
118+
}
119+
return len(s) == 1
120+
}
64121
```
65122

66123
### **TypeScript**
67124

68125
```ts
69-
126+
function removeOnes(grid: number[][]): boolean {
127+
const s = new Set<string>();
128+
for (const row of grid) {
129+
if (row[0] === 1) {
130+
for (let i = 0; i < row.length; i++) {
131+
row[i] ^= 1;
132+
}
133+
}
134+
const t = row.join('');
135+
s.add(t);
136+
}
137+
return s.size === 1;
138+
}
70139
```
71140

72141
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution {
2+
public:
3+
bool removeOnes(vector<vector<int>>& grid) {
4+
unordered_set<string> s;
5+
for (auto& row : grid) {
6+
string t;
7+
for (int x : row) {
8+
t.push_back('0' + (row[0] == 0 ? x : x ^ 1));
9+
}
10+
s.insert(t);
11+
}
12+
return s.size() == 1;
13+
}
14+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
func removeOnes(grid [][]int) bool {
2+
s := map[string]bool{}
3+
for _, row := range grid {
4+
t := []byte{}
5+
for _, x := range row {
6+
if row[0] == 1 {
7+
x ^= 1
8+
}
9+
t = append(t, byte(x)+'0')
10+
}
11+
s[string(t)] = true
12+
}
13+
return len(s) == 1
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution {
2+
public boolean removeOnes(int[][] grid) {
3+
Set<String> s = new HashSet<>();
4+
int n = grid[0].length;
5+
for (var row : grid) {
6+
var cs = new char[n];
7+
for (int i = 0; i < n; ++i) {
8+
cs[i] = (char) (row[0] ^ row[i]);
9+
}
10+
s.add(String.valueOf(cs));
11+
}
12+
return s.size() == 1;
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class Solution:
2+
def removeOnes(self, grid: List[List[int]]) -> bool:
3+
s = set()
4+
for row in grid:
5+
t = tuple(row) if row[0] == grid[0][0] else tuple(x ^ 1 for x in row)
6+
s.add(t)
7+
return len(s) == 1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
function removeOnes(grid: number[][]): boolean {
2+
const s = new Set<string>();
3+
for (const row of grid) {
4+
if (row[0] === 1) {
5+
for (let i = 0; i < row.length; i++) {
6+
row[i] ^= 1;
7+
}
8+
}
9+
const t = row.join('');
10+
s.add(t);
11+
}
12+
return s.size === 1;
13+
}

0 commit comments

Comments
 (0)