Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit efdbe91

Browse files
author
Zhang Xiaodong
committed
solve 36
1 parent 4ffb481 commit efdbe91

File tree

2 files changed

+150
-0
lines changed

2 files changed

+150
-0
lines changed

src/solution/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,4 @@ mod s0032_longest_valid_parentheses;
3131
mod s0033_search_in_rotated_sorted_array;
3232
mod s0034_find_first_and_last_position_of_element_in_sorted_array;
3333
mod s0035_search_insert_position;
34+
mod s0036_valid_sudoku;

src/solution/s0036_valid_sudoku.rs

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
/**
2+
* [36] 有效的数独
3+
*
4+
* 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
5+
* <ol>
6+
* 数字 1-9 在每一行只能出现一次。
7+
* 数字 1-9 在每一列只能出现一次。
8+
* 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
9+
* </ol>
10+
*
11+
* 注意:
12+
*
13+
* 一个有效的数独(部分已被填充)不一定是可解的。
14+
* 只需要根据以上规则,验证已经填入的数字是否有效即可。
15+
* 空白格用 '.' 表示。
16+
*
17+
*
18+
* 示例 1:
19+
* <img src="https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2021/04/12/250px-sudoku-by-l2g-20050714svg.png" style="height:250px; width:250px" />
20+
* 输入:board =
21+
* [["5","3",".",".","7",".",".",".","."]
22+
* ,["6",".",".","1","9","5",".",".","."]
23+
* ,[".","9","8",".",".",".",".","6","."]
24+
* ,["8",".",".",".","6",".",".",".","3"]
25+
* ,["4",".",".","8",".","3",".",".","1"]
26+
* ,["7",".",".",".","2",".",".",".","6"]
27+
* ,[".","6",".",".",".",".","2","8","."]
28+
* ,[".",".",".","4","1","9",".",".","5"]
29+
* ,[".",".",".",".","8",".",".","7","9"]]
30+
* 输出:true
31+
*
32+
* 示例 2:
33+
*
34+
* 输入:board =
35+
* [["8","3",".",".","7",".",".",".","."]
36+
* ,["6",".",".","1","9","5",".",".","."]
37+
* ,[".","9","8",".",".",".",".","6","."]
38+
* ,["8",".",".",".","6",".",".",".","3"]
39+
* ,["4",".",".","8",".","3",".",".","1"]
40+
* ,["7",".",".",".","2",".",".",".","6"]
41+
* ,[".","6",".",".",".",".","2","8","."]
42+
* ,[".",".",".","4","1","9",".",".","5"]
43+
* ,[".",".",".",".","8",".",".","7","9"]]
44+
* 输出:false
45+
* 解释:除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。
46+
*
47+
* 提示:
48+
*
49+
* board.length == 9
50+
* board[i].length == 9
51+
* board[i][j] 是一位数字(1-9)或者 '.'
52+
*
53+
*/
54+
pub struct Solution {}
55+
56+
// problem: https://leetcode.cn/problems/valid-sudoku/
57+
// discuss: https://leetcode.cn/problems/valid-sudoku/discuss/?currentPage=1&orderBy=most_votes&query=
58+
59+
// submission codes start here
60+
61+
impl Solution {
62+
pub fn is_valid_sudoku(board: Vec<Vec<char>>) -> bool {
63+
for row in &board {
64+
let mut exists = vec![0u8; 10];
65+
for c in row {
66+
if *c != '.' {
67+
let c = *c as usize - '0' as usize;
68+
if exists[c] > 0 {
69+
return false;
70+
}
71+
exists[c] = 1;
72+
}
73+
}
74+
}
75+
76+
for col in (0..9) {
77+
let mut exists = vec![0u8; 10];
78+
for i in (0..9) {
79+
let c = &board[i][col];
80+
if *c != '.' {
81+
let c = *c as usize - '0' as usize;
82+
if exists[c] > 0 {
83+
return false;
84+
}
85+
exists[c] = 1;
86+
}
87+
}
88+
}
89+
90+
for i in (0..9).step_by(3) {
91+
for j in (0..9).step_by(3) {
92+
let mut exists = vec![0u8; 10];
93+
for m in (i..i + 3) {
94+
for n in (j..j + 3) {
95+
let c = board[m][n];
96+
if c == '.' {
97+
continue;
98+
}
99+
let c = c as usize - '0' as usize;
100+
if exists[c] > 0 {
101+
return false;
102+
}
103+
exists[c] = 1;
104+
}
105+
}
106+
}
107+
}
108+
true
109+
}
110+
}
111+
112+
// submission codes end
113+
114+
#[cfg(test)]
115+
mod tests {
116+
use super::*;
117+
118+
#[test]
119+
fn test_36() {
120+
assert_eq!(
121+
Solution::is_valid_sudoku(vec![
122+
vec!['5', '3', '.', '.', '7', '.', '.', '.', '.'],
123+
vec!['6', '.', '.', '1', '9', '5', '.', '.', '.'],
124+
vec!['.', '9', '8', '.', '.', '.', '.', '6', '.'],
125+
vec!['8', '.', '.', '.', '6', '.', '.', '.', '3'],
126+
vec!['4', '.', '.', '8', '.', '3', '.', '.', '1'],
127+
vec!['7', '.', '.', '.', '2', '.', '.', '.', '6'],
128+
vec!['.', '6', '.', '.', '.', '.', '2', '8', '.'],
129+
vec!['.', '.', '.', '4', '1', '9', '.', '.', '5'],
130+
vec!['.', '.', '.', '.', '8', '.', '.', '7', '9'],
131+
]),
132+
true
133+
);
134+
assert_eq!(
135+
Solution::is_valid_sudoku(vec![
136+
vec!['8', '3', '.', '.', '7', '.', '.', '.', '9'],
137+
vec!['6', '.', '.', '1', '9', '5', '.', '.', '.'],
138+
vec!['.', '9', '8', '.', '.', '.', '.', '6', '.'],
139+
vec!['8', '.', '.', '.', '6', '.', '.', '.', '3'],
140+
vec!['4', '.', '.', '8', '.', '3', '.', '.', '1'],
141+
vec!['7', '.', '.', '.', '2', '.', '.', '.', '6'],
142+
vec!['.', '6', '.', '.', '.', '.', '2', '8', '.'],
143+
vec!['.', '.', '.', '4', '1', '9', '.', '.', '5'],
144+
vec!['.', '.', '.', '.', '8', '.', '.', '7', '9'],
145+
]),
146+
false
147+
);
148+
}
149+
}

0 commit comments

Comments
 (0)