判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
数独部分空格内已填入了数字,空白格用 '.' 表示。
示例 1:
输入:
[
["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"]
]
输出: true
示例 2:
输入:
[
["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"]
]
输出: false
解释: 除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。
但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。
说明:
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
给定数独序列只包含数字 1-9 和字符 '.' 。
给定数独永远是 9x9 形式的。
解题思路:
本题主要判断每一行、每一列及每个九宫格的数组中有没有重复数字出现,所以要对其进行判断。
解题时,我卡在了temp2.clear()、temp.clear()这两条语句的有无及放置位置上了,位置不合适,则就不能清空列表中的元素,再进行使用就容易出错。
Python:
class Solution:
def isValidSudoku(self, board):
"""
:type board: List[List[str]]
:rtype: bool
"""
temp = []
temp2 = []
for i in range(9):
temp = board[i][:]
for j in range(9):
if(temp[j] != "."):
temp2.append(temp[j])
if(len(temp2) != len(set(temp2))):
return False
temp2.clear()
temp.clear()
for i in range(9):
for j in range(9):
temp.append(board[j][i])
for k in range(9):
if(temp[k] != "."):
temp2.append(temp[k])
if(len(temp2) != len(set(temp2))):
return False
temp2.clear()
temp.clear()
for i in [1,4,7]:
for j in [1,4,7]:
temp = [board[i-1][j-1], board[i-1][j],board[i-1][j+1],
board[i][j-1] , board[i][j], board[i][j+1],
board[i+1][j-1], board[i+1][j],board[i+1][j+1]]
for k in range(9):
if(temp[k] != "."):
temp2.append(temp[k])
if(len(temp2) != len(set(temp2))):
return False
temp2.clear()
#temp.clear()
return True
C++
自己之前没有想到对九宫格的坐标进行转换,还是思考不够。这种解法相对较慢,还有很多非常快的解法。
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
for (int i = 0; i < 9; ++i){
set<char> line, col, cube;
for (int j = 0; j < 9; ++j){
if ('.' != board[i][j] && !line.insert(board[i][j]).second)
return false;
if ('.' != board[j][i] && !col.insert(board[j][i]).second)
return false;
int m = 3 * (i / 3) + (j / 3);
int n = 3 * (i % 3) + (j % 3);
if ('.' != board[m][n] && !cube.insert(board[m][n]).second)
return false;
}
}
return true;
}
};