36. 有效的数独
请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
注意:
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
空白格用 ‘.’ 表示。
C++
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int rows[9][9];
int cloumns[9][9];
int subboxes[3][3][9];
memset(rows,0,sizeof(rows));
memset(cloumns,0,sizeof(cloumns));
memset(subboxes,0,sizeof(subboxes));
for( int i=0;i<9;i++ ){
for( int j=0;j<9;j++ ){
char c=board[i][j];
if( '.'!=c ){
int index=c-'0'-1;
//printf("c:%c|c-1:%d|c-0:%d.",c,c-1,c-'0');
//printf("c-0-1:%d.",c-'0'-1);
rows[i][index]++;
cloumns[j][index]++;
subboxes[i/3][j/3][index]++;
if( rows[i][index]>1 || cloumns[j][index]>1 || subboxes[i/3][j/3][index]>1 ){
return false;
}
}
}
}
return true;
}
};
时间复杂度
O ( N 2 ) O(N^2) O(N2)
空间复杂度
O ( 1 ) O(1) O(1)
Java
class Solution {
public boolean isValidSudoku(char[][] board) {
int [][] rows=new int[9][9];
int [][] columns=new int[9][9];
int [][][] subboxes=new int [3][3][9];
for( int i=0;i<9;i++ ){
for( int j=0;j<9;j++ ){
char c=board[i][j];
if( c!='.' ){
int index=(int)(c-'0')-1;
rows[i][index]++;
columns[j][index]++;
subboxes[i/3][j/3][index]++;
if( rows[i][index]>1 || columns[j][index]>1 || subboxes[i/3][j/3][index]>1 ){
return false;
}
}
}
}
return true;
}
}
时间复杂度
O ( N 2 ) O(N^2) O(N2)
空间复杂度
O ( 1 ) O(1) O(1)
Python
import numpy as np
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
rows=np.zeros((9,9));
columns=np.zeros((9,9));
subboxes=np.zeros((3,3,9));
for i in range(9):
for j in range(9):
c=board[i][j];
if '.'!=c:
index=ord(c)-ord('0')-1;
rows[i,index]=rows[i,index]+1;
columns[j,index]=columns[j,index]+1;
subboxes[int(i/3),int(j/3),index]=subboxes[int(i/3),int(j/3),index]+1;
if rows[i][index]>1 or columns[j][index]>1 or subboxes[int(i/3)][int(j/3)][index]>1:
return False;
return True;
时间复杂度
O ( N 2 ) O(N^2) O(N2)
空间复杂度
O ( 1 ) O(1) O(1)