leetcode中等36有效的数独
Posted qq_40707462
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode中等36有效的数独相关的知识,希望对你有一定的参考价值。
思路:用二维数组row[][],col[][],block[][]
分别记录每一行、列、方格中,某一数字是否出现过
计算3x3方格的标号:
0 1 2
3 4 5
6 7 8
每个数字代表一个3*3的格子的blockIndex,
先看列,是按照加一的方式增加,所以是j / 3
再看行,是按照0*3 1*3 2*3 的方式增加 所以先除3算出前面的数,也就是0 1 2 ,再乘3
行 + 列 就是方格中元素的blockIndex
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
row=[[False for _ in range(9)]for _ in range(9)]
col=[[False for _ in range(9)]for _ in range(9)]
block=[[False for _ in range(9)]for _ in range(9)]
#不知道为什么不能=[[False]*9]*9
for i in range(9):
for j in range(9):
if board[i][j]!=".":
num=int(board[i][j])-1
blockIndex=i//3*3+j//3
if row[i][num] or col[j][num] or block[blockIndex][num]:
return False
else:
row[i][num]=True
col[j][num]=True
block[blockIndex][num]=True
return True
class Solution {
public boolean isValidSudoku(char[][] board) {
// 记录某行,某位数字是否已经被摆放
boolean[][] row = new boolean[9][9];
// 记录某列,某位数字是否已经被摆放
boolean[][] col = new boolean[9][9];
// 记录某 3x3 宫格内,某位数字是否已经被摆放
boolean[][] block = new boolean[9][9];
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(board[i][j]!='.'){
int num=board[i][j]-'1';//如果 -'0',会出现9,但bollean[][]下标为0-8
int blockIndex=i/3*3+j/3;
if(row[i][num] || col[j][num] || block[blockIndex][num]){
return false;
}else{
row[i][num]=true;
col[j][num]=true;
block[blockIndex][num]=true;
}
}
}
}
return true;
}
}
以上是关于leetcode中等36有效的数独的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode刷题100天—36. 有效的数独(数组+哈希)—day26
Leetcode刷题100天—36. 有效的数独(数组+哈希)—day26