Leetcode——有效的数独
Posted Yawn,
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode——有效的数独相关的知识,希望对你有一定的参考价值。
1. 题目
请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。
注意:
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
示例 1:
提示:
board.length == 9
board[i].length == 9
board[i][j] 是一位数字或者 ‘.’
2. 题解
按照从左往右,从上往下的顺序遍历一次,
只需要比较同行,同列,同box是否存在相同的值,可分为三个维度,把每个数字放在对应位置,判断是否存在即可,不用考虑同时符合三个维度条件,单一判断即可
class Solution {
public boolean isValidSudoku(char[][] board) {
int[][] row = new int[9][9];
int[][] col = new int[9][9];
int[][][] box = new int[3][3][9]; //存储每一个box的每个数是否出现过,默认初始情况下,在每个box中,每个数都没有出现过。整个board有9个box。
for(int i = 0; i < board.length; i++){
for(int j = 0; j < board[0].length; j++){
// 遍历到第i行第j列的那个数,我们要判断这个数在其所在的行有没有出现过,
// 同时判断这个数在其所在的列有没有出现过
// 同时判断这个数在其所在的box中有没有出现过
if(board[i][j] == '.') {
continue;
}
int num = board[i][j] - '0' - 1; //-‘0’为了把char转int,-1为了得到真实坐标值0-8
if(row[i][num] == 1 || col[j][num] == 1 || box[i / 3][j / 3][num] == 1){
return false;
}
row[i][num] = 1; // 之前都没出现过,现在出现了,就给它置为1,下次再遇见就能够直接返回false了。
col[j][num] = 1;
box[i / 3][j / 3][num] = 1;
}
}
return true;
}
}
以上是关于Leetcode——有效的数独的主要内容,如果未能解决你的问题,请参考以下文章