36. Valid Sudoku
Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:
- Each row must contain the digits
1-9without repetition. - Each column must contain the digits
1-9without repetition. - Each of the 9
3x3sub-boxes of the grid must contain the digits1-9without repetition.

A partially filled sudoku which is valid.
The Sudoku board could be partially filled, where empty cells are filled with the character '.'.
Example 1:
Input:
[
["5","3",".",".","7",".",".",".","."],
["6",".",".","1","9","5",".",".","."],
[".","9","8",".",".",".",".","6","."],
["8",".",".",".","6",".",".",".","3"],
["4",".",".","8",".","3",".",".","1"],
["7",".",".",".","2",".",".",".","6"],
[".","6",".",".",".",".","2","8","."],
[".",".",".","4","1","9",".",".","5"],
[".",".",".",".","8",".",".","7","9"]
]
Output: true
Example 2:
Input:
[
["8","3",".",".","7",".",".",".","."],
["6",".",".","1","9","5",".",".","."],
[".","9","8",".",".",".",".","6","."],
["8",".",".",".","6",".",".",".","3"],
["4",".",".","8",".","3",".",".","1"],
["7",".",".",".","2",".",".",".","6"],
[".","6",".",".",".",".","2","8","."],
[".",".",".","4","1","9",".",".","5"],
[".",".",".",".","8",".",".","7","9"]
]
Output: false
Explanation: Same as Example 1, except with the 5 in the top left corner being
modified to 8. Since there are two 8's in the top left 3x3 sub-box, it is invalid.
Note:
- A Sudoku board (partially filled) could be valid but is not necessarily solvable.
- Only the filled cells need to be validated according to the mentioned rules.
- The given board contain only digits
1-9and the character'.'. - The given board size is always
9x9.
题目链接:https://leetcode.com/problems/valid-sudoku/
法一:暴力法
暴力法很容易就能想到,先按行判断,再按列判断,再按方阵判断,一共3次遍历。
时间复杂度O(n),空间复杂度O(1)。
法二:空间换时间
只需要一次遍历,开辟空间来储存元素,比较简单的就是数组,查找方便。
时间复杂度O(n),空间复杂度O(n)。
网友用的哈希表存储:https://leetcode.wang/leetCode-36-Valid-Sudoku.html
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int len = board.size();
int box[len * 3][10];
for (int i=0;i<len*3;++i){
memset(box,0,sizeof(box));
}
for(int i = 0; i<len;++i){
for(int j = 0; j<len;++j){
int tmp = board[i][j] - '0';
int dot = '.' - '0';
if(tmp==dot) continue;
if(tmp>=1 && tmp<=9
&& box[i][tmp]!=1 && box[j+9][tmp]!=1
&& box[int(i/3)*3+int(j/3)+18][tmp]!=1){
box[i][tmp]=1;
box[j+9][tmp]=1;
box[int(i/3)*3+int(j/3)+18][tmp]=1;
}else return false;
}
}
return true;
}
};
代码很简单,但花了很多时间在数组初始化的调试上:
数组声明后,元素值是随机的,没有统一初始化就会导致后续的!=1判断出错。
void *memset(void *s,int c,size_t n)
总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。
ps.看来要找本书仔细复习下c++啦

本文详细解析了如何通过两次遍历验证9x9数独板的有效性,包括按行、按列和按3x3子网格检查数字1-9是否重复出现。提供了两种方法:暴力法和空间换时间法,并附带了C++代码实现。
692

被折叠的 条评论
为什么被折叠?



