Skip to content

Commit c2944c1

Browse files
committed
feat: add solutions to lc problem: No.0036. Valid Sudoku
1 parent 166efbb commit c2944c1

File tree

7 files changed

+342
-96
lines changed

7 files changed

+342
-96
lines changed

solution/0000-0099/0036.Valid Sudoku/README.md

Lines changed: 125 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,27 +67,150 @@
6767
<li><code>board[i][j]</code> 是一位数字或者 <code>'.'</code></li>
6868
</ul>
6969

70-
7170
## 解法
7271

7372
<!-- 这里可写通用的实现逻辑 -->
7473

74+
求第 i 行、第 j 列,以及第 k 个 `3*3` 宫格是否含有相同数字,如果是,则返回 false。遍历结束,返回 true。
75+
7576
<!-- tabs:start -->
7677

7778
### **Python3**
7879

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

8182
```python
82-
83+
class Solution:
84+
def isValidSudoku(self, board: List[List[str]]) -> bool:
85+
row = [[False] * 9 for _ in range(9)]
86+
col = [[False] * 9 for _ in range(9)]
87+
sub = [[False] * 9 for _ in range(9)]
88+
for i in range(9):
89+
for j in range(9):
90+
c = board[i][j]
91+
if c == '.':
92+
continue
93+
num = int(c) - 1
94+
k = i // 3 * 3 + j // 3
95+
if row[i][num] or col[j][num] or sub[k][num]:
96+
return False
97+
row[i][num] = True
98+
col[j][num] = True
99+
sub[k][num] = True
100+
return True
83101
```
84102

85103
### **Java**
86104

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

89107
```java
108+
class Solution {
109+
public boolean isValidSudoku(char[][] board) {
110+
boolean[][] row = new boolean[9][9];
111+
boolean[][] col = new boolean[9][9];
112+
boolean[][] sub = new boolean[9][9];
113+
for (int i = 0; i < 9; ++i) {
114+
for (int j = 0; j < 9; ++j) {
115+
char c = board[i][j];
116+
if (c == '.') {
117+
continue;
118+
}
119+
int num = c - '0' - 1;
120+
int k = i / 3 * 3 + j / 3;
121+
if (row[i][num] || col[j][num] || sub[k][num]) {
122+
return false;
123+
}
124+
row[i][num] = true;
125+
col[j][num] = true;
126+
sub[k][num] = true;
127+
}
128+
}
129+
return true;
130+
}
131+
}
132+
```
133+
134+
### **C++**
135+
136+
```cpp
137+
class Solution {
138+
public:
139+
bool isValidSudoku(vector<vector<char>>& board) {
140+
vector<vector<bool>> row(9, vector<bool>(9, false));
141+
vector<vector<bool>> col(9, vector<bool>(9, false));
142+
vector<vector<bool>> sub(9, vector<bool>(9, false));
143+
for (int i = 0; i < 9; ++i) {
144+
for (int j = 0; j < 9; ++j) {
145+
char c = board[i][j];
146+
if (c == '.') continue;
147+
int num = c - '0' - 1;
148+
int k = i / 3 * 3 + j / 3;
149+
if (row[i][num] || col[j][num] || sub[k][num]) {
150+
return false;
151+
}
152+
row[i][num] = true;
153+
col[j][num] = true;
154+
sub[k][num] = true;
155+
}
156+
}
157+
return true;
158+
}
159+
};
160+
```
161+
162+
### **Go**
163+
164+
```go
165+
func isValidSudoku(board [][]byte) bool {
166+
row, col, sub := [9][9]bool{}, [9][9]bool{}, [9][9]bool{}
167+
for i := 0; i < 9; i++ {
168+
for j := 0; j < 9; j++ {
169+
num := board[i][j] - byte('1')
170+
if num < 0 || num > 9 {
171+
continue
172+
}
173+
k := i/3*3 + j/3
174+
if row[i][num] || col[j][num] || sub[k][num] {
175+
return false
176+
}
177+
row[i][num] = true
178+
col[j][num] = true
179+
sub[k][num] = true
180+
}
181+
}
182+
return true
183+
}
184+
```
90185

186+
### **JavaScript**
187+
188+
```js
189+
/**
190+
* @param {character[][]} board
191+
* @return {boolean}
192+
*/
193+
var isValidSudoku = function(board) {
194+
let row = [...Array(9)].map(() => Array(9).fill(false));
195+
let col = [...Array(9)].map(() => Array(9).fill(false));
196+
let sub = [...Array(9)].map(() => Array(9).fill(false));
197+
for (let i = 0; i < 9; ++i) {
198+
for (let j = 0; j < 9; ++j) {
199+
const num = board[i][j].charCodeAt() - '1'.charCodeAt();
200+
if (num < 0 || num > 9) {
201+
continue;
202+
}
203+
const k = Math.floor(i / 3) * 3 + Math.floor(j / 3);
204+
if (row[i][num] || col[j][num] || sub[k][num]) {
205+
return false;
206+
}
207+
row[i][num] = true;
208+
col[j][num] = true;
209+
sub[k][num] = true;
210+
}
211+
}
212+
return true;
213+
};
91214
```
92215

93216
### **...**

solution/0000-0099/0036.Valid Sudoku/README_EN.md

Lines changed: 123 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,135 @@
7070
### **Python3**
7171

7272
```python
73-
73+
class Solution:
74+
def isValidSudoku(self, board: List[List[str]]) -> bool:
75+
row = [[False] * 9 for _ in range(9)]
76+
col = [[False] * 9 for _ in range(9)]
77+
sub = [[False] * 9 for _ in range(9)]
78+
for i in range(9):
79+
for j in range(9):
80+
c = board[i][j]
81+
if c == '.':
82+
continue
83+
num = int(c) - 1
84+
k = i // 3 * 3 + j // 3
85+
if row[i][num] or col[j][num] or sub[k][num]:
86+
return False
87+
row[i][num] = True
88+
col[j][num] = True
89+
sub[k][num] = True
90+
return True
7491
```
7592

7693
### **Java**
7794

7895
```java
96+
class Solution {
97+
public boolean isValidSudoku(char[][] board) {
98+
boolean[][] row = new boolean[9][9];
99+
boolean[][] col = new boolean[9][9];
100+
boolean[][] sub = new boolean[9][9];
101+
for (int i = 0; i < 9; ++i) {
102+
for (int j = 0; j < 9; ++j) {
103+
char c = board[i][j];
104+
if (c == '.') {
105+
continue;
106+
}
107+
int num = c - '0' - 1;
108+
int k = i / 3 * 3 + j / 3;
109+
if (row[i][num] || col[j][num] || sub[k][num]) {
110+
return false;
111+
}
112+
row[i][num] = true;
113+
col[j][num] = true;
114+
sub[k][num] = true;
115+
}
116+
}
117+
return true;
118+
}
119+
}
120+
```
121+
122+
### **C++**
123+
124+
```cpp
125+
class Solution {
126+
public:
127+
bool isValidSudoku(vector<vector<char>>& board) {
128+
vector<vector<bool>> row(9, vector<bool>(9, false));
129+
vector<vector<bool>> col(9, vector<bool>(9, false));
130+
vector<vector<bool>> sub(9, vector<bool>(9, false));
131+
for (int i = 0; i < 9; ++i) {
132+
for (int j = 0; j < 9; ++j) {
133+
char c = board[i][j];
134+
if (c == '.') continue;
135+
int num = c - '0' - 1;
136+
int k = i / 3 * 3 + j / 3;
137+
if (row[i][num] || col[j][num] || sub[k][num]) {
138+
return false;
139+
}
140+
row[i][num] = true;
141+
col[j][num] = true;
142+
sub[k][num] = true;
143+
}
144+
}
145+
return true;
146+
}
147+
};
148+
```
149+
150+
### **Go**
151+
152+
```go
153+
func isValidSudoku(board [][]byte) bool {
154+
row, col, sub := [9][9]bool{}, [9][9]bool{}, [9][9]bool{}
155+
for i := 0; i < 9; i++ {
156+
for j := 0; j < 9; j++ {
157+
num := board[i][j] - byte('1')
158+
if num < 0 || num > 9 {
159+
continue
160+
}
161+
k := i/3*3 + j/3
162+
if row[i][num] || col[j][num] || sub[k][num] {
163+
return false
164+
}
165+
row[i][num] = true
166+
col[j][num] = true
167+
sub[k][num] = true
168+
}
169+
}
170+
return true
171+
}
172+
```
79173

174+
### **JavaScript**
175+
176+
```js
177+
/**
178+
* @param {character[][]} board
179+
* @return {boolean}
180+
*/
181+
var isValidSudoku = function(board) {
182+
let row = [...Array(9)].map(() => Array(9).fill(false));
183+
let col = [...Array(9)].map(() => Array(9).fill(false));
184+
let sub = [...Array(9)].map(() => Array(9).fill(false));
185+
for (let i = 0; i < 9; ++i) {
186+
for (let j = 0; j < 9; ++j) {
187+
const num = board[i][j].charCodeAt() - '1'.charCodeAt();
188+
if (num < 0 || num > 9) {
189+
continue;
190+
}
191+
const k = Math.floor(i / 3) * 3 + Math.floor(j / 3);
192+
if (row[i][num] || col[j][num] || sub[k][num]) {
193+
return false;
194+
}
195+
row[i][num] = true;
196+
col[j][num] = true;
197+
sub[k][num] = true;
198+
}
199+
}
200+
return true;
201+
};
80202
```
81203

82204
### **...**
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public:
3+
bool isValidSudoku(vector<vector<char>>& board) {
4+
vector<vector<bool>> row(9, vector<bool>(9, false));
5+
vector<vector<bool>> col(9, vector<bool>(9, false));
6+
vector<vector<bool>> sub(9, vector<bool>(9, false));
7+
for (int i = 0; i < 9; ++i) {
8+
for (int j = 0; j < 9; ++j) {
9+
char c = board[i][j];
10+
if (c == '.') continue;
11+
int num = c - '0' - 1;
12+
int k = i / 3 * 3 + j / 3;
13+
if (row[i][num] || col[j][num] || sub[k][num]) {
14+
return false;
15+
}
16+
row[i][num] = true;
17+
col[j][num] = true;
18+
sub[k][num] = true;
19+
}
20+
}
21+
return true;
22+
}
23+
};
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
func isValidSudoku(board [][]byte) bool {
2+
row, col, sub := [9][9]bool{}, [9][9]bool{}, [9][9]bool{}
3+
for i := 0; i < 9; i++ {
4+
for j := 0; j < 9; j++ {
5+
num := board[i][j] - byte('1')
6+
if num < 0 || num > 9 {
7+
continue
8+
}
9+
k := i/3*3 + j/3
10+
if row[i][num] || col[j][num] || sub[k][num] {
11+
return false
12+
}
13+
row[i][num] = true
14+
col[j][num] = true
15+
sub[k][num] = true
16+
}
17+
}
18+
return true
19+
}

solution/0000-0099/0036.Valid Sudoku/Solution.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,22 @@
11
class Solution {
22
public boolean isValidSudoku(char[][] board) {
3-
for(int i = 0; i < 9; i++) {
4-
HashSet<Character> col = new HashSet<>() , row = new HashSet<>() , cube = new HashSet<>();
5-
for(int j = 0; j < 9; j++) {
6-
if(board[i][j] != '.' && !row.add(board[i][j])) return false;
7-
if(board[j][i] != '.' && !col.add(board[j][i])) return false;
8-
int colIndex = i/3*3+j/3 , rowIndex = i%3*3+j%3;
9-
if(board[rowIndex][colIndex] != '.' && !cube.add(board[rowIndex][colIndex])) return false;
3+
boolean[][] row = new boolean[9][9];
4+
boolean[][] col = new boolean[9][9];
5+
boolean[][] sub = new boolean[9][9];
6+
for (int i = 0; i < 9; ++i) {
7+
for (int j = 0; j < 9; ++j) {
8+
char c = board[i][j];
9+
if (c == '.') {
10+
continue;
11+
}
12+
int num = c - '0' - 1;
13+
int k = i / 3 * 3 + j / 3;
14+
if (row[i][num] || col[j][num] || sub[k][num]) {
15+
return false;
16+
}
17+
row[i][num] = true;
18+
col[j][num] = true;
19+
sub[k][num] = true;
1020
}
1121
}
1222
return true;

0 commit comments

Comments
 (0)