Skip to content

Commit 718bb40

Browse files
authored
feat: add solutions to lc problem: No.2133 (#3514)
No.2133.Check if Every Row and Column Contains All Numbers
1 parent 6b5f6b8 commit 718bb40

File tree

7 files changed

+157
-164
lines changed

7 files changed

+157
-164
lines changed

solution/2100-2199/2133.Check if Every Row and Column Contains All Numbers/README.md

+53-54
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,11 @@ tags:
6464

6565
<!-- solution:start -->
6666

67-
### 方法一
67+
### 方法一:哈希表
68+
69+
遍历矩阵的每一行和每一列,使用哈希表记录每个数字是否出现过,如果某一行或某一列中有数字重复出现,则返回 `false`,否则返回 `true`
70+
71+
时间复杂度 $O(n^2)$,空间复杂度 $O(n)$。其中 $n$ 为矩阵的大小。
6872

6973
<!-- tabs:start -->
7074

@@ -74,21 +78,7 @@ tags:
7478
class Solution:
7579
def checkValid(self, matrix: List[List[int]]) -> bool:
7680
n = len(matrix)
77-
for i in range(n):
78-
seen = [False] * n
79-
for j in range(n):
80-
v = matrix[i][j] - 1
81-
if seen[v]:
82-
return False
83-
seen[v] = True
84-
for j in range(n):
85-
seen = [False] * n
86-
for i in range(n):
87-
v = matrix[i][j] - 1
88-
if seen[v]:
89-
return False
90-
seen[v] = True
91-
return True
81+
return all(len(set(row)) == n for row in chain(matrix, zip(*matrix)))
9282
```
9383

9484
#### Java
@@ -97,24 +87,23 @@ class Solution:
9787
class Solution {
9888
public boolean checkValid(int[][] matrix) {
9989
int n = matrix.length;
100-
for (int i = 0; i < n; ++i) {
101-
boolean[] seen = new boolean[n];
102-
for (int j = 0; j < n; ++j) {
103-
int v = matrix[i][j] - 1;
104-
if (seen[v]) {
90+
boolean[] vis = new boolean[n + 1];
91+
for (var row : matrix) {
92+
Arrays.fill(vis, false);
93+
for (int x : row) {
94+
if (vis[x]) {
10595
return false;
10696
}
107-
seen[v] = true;
97+
vis[x] = true;
10898
}
10999
}
110100
for (int j = 0; j < n; ++j) {
111-
boolean[] seen = new boolean[n];
101+
Arrays.fill(vis, false);
112102
for (int i = 0; i < n; ++i) {
113-
int v = matrix[i][j] - 1;
114-
if (seen[v]) {
103+
if (vis[matrix[i][j]]) {
115104
return false;
116105
}
117-
seen[v] = true;
106+
vis[matrix[i][j]] = true;
118107
}
119108
}
120109
return true;
@@ -129,20 +118,23 @@ class Solution {
129118
public:
130119
bool checkValid(vector<vector<int>>& matrix) {
131120
int n = matrix.size();
132-
for (int i = 0; i < n; ++i) {
133-
vector<bool> seen(n);
134-
for (int j = 0; j < n; ++j) {
135-
int v = matrix[i][j] - 1;
136-
if (seen[v]) return false;
137-
seen[v] = true;
121+
bool vis[n + 1];
122+
for (const auto& row : matrix) {
123+
memset(vis, false, sizeof(vis));
124+
for (int x : row) {
125+
if (vis[x]) {
126+
return false;
127+
}
128+
vis[x] = true;
138129
}
139130
}
140131
for (int j = 0; j < n; ++j) {
141-
vector<bool> seen(n);
132+
memset(vis, false, sizeof(vis));
142133
for (int i = 0; i < n; ++i) {
143-
int v = matrix[i][j] - 1;
144-
if (seen[v]) return false;
145-
seen[v] = true;
134+
if (vis[matrix[i][j]]) {
135+
return false;
136+
}
137+
vis[matrix[i][j]] = true;
146138
}
147139
}
148140
return true;
@@ -155,24 +147,22 @@ public:
155147
```go
156148
func checkValid(matrix [][]int) bool {
157149
n := len(matrix)
158-
for i := 0; i < n; i++ {
159-
seen := make([]bool, n)
160-
for j := 0; j < n; j++ {
161-
v := matrix[i][j] - 1
162-
if seen[v] {
150+
for _, row := range matrix {
151+
vis := make([]bool, n+1)
152+
for _, x := range row {
153+
if vis[x] {
163154
return false
164155
}
165-
seen[v] = true
156+
vis[x] = true
166157
}
167158
}
168159
for j := 0; j < n; j++ {
169-
seen := make([]bool, n)
160+
vis := make([]bool, n+1)
170161
for i := 0; i < n; i++ {
171-
v := matrix[i][j] - 1
172-
if seen[v] {
162+
if vis[matrix[i][j]] {
173163
return false
174164
}
175-
seen[v] = true
165+
vis[matrix[i][j]] = true
176166
}
177167
}
178168
return true
@@ -184,14 +174,23 @@ func checkValid(matrix [][]int) bool {
184174
```ts
185175
function checkValid(matrix: number[][]): boolean {
186176
const n = matrix.length;
187-
let rows = Array.from({ length: n }, () => new Array(n).fill(false));
188-
let cols = Array.from({ length: n }, () => new Array(n).fill(false));
189-
for (let i = 0; i < n; i++) {
190-
for (let j = 0; j < n; j++) {
191-
let cur = matrix[i][j];
192-
if (rows[i][cur] || cols[j][cur]) return false;
193-
rows[i][cur] = true;
194-
cols[j][cur] = true;
177+
const vis: boolean[] = Array(n + 1).fill(false);
178+
for (const row of matrix) {
179+
vis.fill(false);
180+
for (const x of row) {
181+
if (vis[x]) {
182+
return false;
183+
}
184+
vis[x] = true;
185+
}
186+
}
187+
for (let j = 0; j < n; ++j) {
188+
vis.fill(false);
189+
for (let i = 0; i < n; ++i) {
190+
if (vis[matrix[i][j]]) {
191+
return false;
192+
}
193+
vis[matrix[i][j]] = true;
195194
}
196195
}
197196
return true;

solution/2100-2199/2133.Check if Every Row and Column Contains All Numbers/README_EN.md

+53-54
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,11 @@ Hence, we return false.
5858

5959
<!-- solution:start -->
6060

61-
### Solution 1
61+
### Solution 1: Hash Table
62+
63+
Traverse each row and column of the matrix, using a hash table to record whether each number has appeared. If any number appears more than once in a row or column, return `false`; otherwise, return `true`
64+
65+
The time complexity is $O(n^2)$, and the space complexity is $O(n)$. Here, $n$ is the size of the matrix.
6266

6367
<!-- tabs:start -->
6468

@@ -68,21 +72,7 @@ Hence, we return false.
6872
class Solution:
6973
def checkValid(self, matrix: List[List[int]]) -> bool:
7074
n = len(matrix)
71-
for i in range(n):
72-
seen = [False] * n
73-
for j in range(n):
74-
v = matrix[i][j] - 1
75-
if seen[v]:
76-
return False
77-
seen[v] = True
78-
for j in range(n):
79-
seen = [False] * n
80-
for i in range(n):
81-
v = matrix[i][j] - 1
82-
if seen[v]:
83-
return False
84-
seen[v] = True
85-
return True
75+
return all(len(set(row)) == n for row in chain(matrix, zip(*matrix)))
8676
```
8777

8878
#### Java
@@ -91,24 +81,23 @@ class Solution:
9181
class Solution {
9282
public boolean checkValid(int[][] matrix) {
9383
int n = matrix.length;
94-
for (int i = 0; i < n; ++i) {
95-
boolean[] seen = new boolean[n];
96-
for (int j = 0; j < n; ++j) {
97-
int v = matrix[i][j] - 1;
98-
if (seen[v]) {
84+
boolean[] vis = new boolean[n + 1];
85+
for (var row : matrix) {
86+
Arrays.fill(vis, false);
87+
for (int x : row) {
88+
if (vis[x]) {
9989
return false;
10090
}
101-
seen[v] = true;
91+
vis[x] = true;
10292
}
10393
}
10494
for (int j = 0; j < n; ++j) {
105-
boolean[] seen = new boolean[n];
95+
Arrays.fill(vis, false);
10696
for (int i = 0; i < n; ++i) {
107-
int v = matrix[i][j] - 1;
108-
if (seen[v]) {
97+
if (vis[matrix[i][j]]) {
10998
return false;
11099
}
111-
seen[v] = true;
100+
vis[matrix[i][j]] = true;
112101
}
113102
}
114103
return true;
@@ -123,20 +112,23 @@ class Solution {
123112
public:
124113
bool checkValid(vector<vector<int>>& matrix) {
125114
int n = matrix.size();
126-
for (int i = 0; i < n; ++i) {
127-
vector<bool> seen(n);
128-
for (int j = 0; j < n; ++j) {
129-
int v = matrix[i][j] - 1;
130-
if (seen[v]) return false;
131-
seen[v] = true;
115+
bool vis[n + 1];
116+
for (const auto& row : matrix) {
117+
memset(vis, false, sizeof(vis));
118+
for (int x : row) {
119+
if (vis[x]) {
120+
return false;
121+
}
122+
vis[x] = true;
132123
}
133124
}
134125
for (int j = 0; j < n; ++j) {
135-
vector<bool> seen(n);
126+
memset(vis, false, sizeof(vis));
136127
for (int i = 0; i < n; ++i) {
137-
int v = matrix[i][j] - 1;
138-
if (seen[v]) return false;
139-
seen[v] = true;
128+
if (vis[matrix[i][j]]) {
129+
return false;
130+
}
131+
vis[matrix[i][j]] = true;
140132
}
141133
}
142134
return true;
@@ -149,24 +141,22 @@ public:
149141
```go
150142
func checkValid(matrix [][]int) bool {
151143
n := len(matrix)
152-
for i := 0; i < n; i++ {
153-
seen := make([]bool, n)
154-
for j := 0; j < n; j++ {
155-
v := matrix[i][j] - 1
156-
if seen[v] {
144+
for _, row := range matrix {
145+
vis := make([]bool, n+1)
146+
for _, x := range row {
147+
if vis[x] {
157148
return false
158149
}
159-
seen[v] = true
150+
vis[x] = true
160151
}
161152
}
162153
for j := 0; j < n; j++ {
163-
seen := make([]bool, n)
154+
vis := make([]bool, n+1)
164155
for i := 0; i < n; i++ {
165-
v := matrix[i][j] - 1
166-
if seen[v] {
156+
if vis[matrix[i][j]] {
167157
return false
168158
}
169-
seen[v] = true
159+
vis[matrix[i][j]] = true
170160
}
171161
}
172162
return true
@@ -178,14 +168,23 @@ func checkValid(matrix [][]int) bool {
178168
```ts
179169
function checkValid(matrix: number[][]): boolean {
180170
const n = matrix.length;
181-
let rows = Array.from({ length: n }, () => new Array(n).fill(false));
182-
let cols = Array.from({ length: n }, () => new Array(n).fill(false));
183-
for (let i = 0; i < n; i++) {
184-
for (let j = 0; j < n; j++) {
185-
let cur = matrix[i][j];
186-
if (rows[i][cur] || cols[j][cur]) return false;
187-
rows[i][cur] = true;
188-
cols[j][cur] = true;
171+
const vis: boolean[] = Array(n + 1).fill(false);
172+
for (const row of matrix) {
173+
vis.fill(false);
174+
for (const x of row) {
175+
if (vis[x]) {
176+
return false;
177+
}
178+
vis[x] = true;
179+
}
180+
}
181+
for (let j = 0; j < n; ++j) {
182+
vis.fill(false);
183+
for (let i = 0; i < n; ++i) {
184+
if (vis[matrix[i][j]]) {
185+
return false;
186+
}
187+
vis[matrix[i][j]] = true;
189188
}
190189
}
191190
return true;

solution/2100-2199/2133.Check if Every Row and Column Contains All Numbers/Solution.cpp

+14-11
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,25 @@ class Solution {
22
public:
33
bool checkValid(vector<vector<int>>& matrix) {
44
int n = matrix.size();
5-
for (int i = 0; i < n; ++i) {
6-
vector<bool> seen(n);
7-
for (int j = 0; j < n; ++j) {
8-
int v = matrix[i][j] - 1;
9-
if (seen[v]) return false;
10-
seen[v] = true;
5+
bool vis[n + 1];
6+
for (const auto& row : matrix) {
7+
memset(vis, false, sizeof(vis));
8+
for (int x : row) {
9+
if (vis[x]) {
10+
return false;
11+
}
12+
vis[x] = true;
1113
}
1214
}
1315
for (int j = 0; j < n; ++j) {
14-
vector<bool> seen(n);
16+
memset(vis, false, sizeof(vis));
1517
for (int i = 0; i < n; ++i) {
16-
int v = matrix[i][j] - 1;
17-
if (seen[v]) return false;
18-
seen[v] = true;
18+
if (vis[matrix[i][j]]) {
19+
return false;
20+
}
21+
vis[matrix[i][j]] = true;
1922
}
2023
}
2124
return true;
2225
}
23-
};
26+
};

0 commit comments

Comments
 (0)