题目的链接在这里:https://leetcode-cn.com/problems/valid-sudoku/
题目大意
请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。
注意:
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
一、示意图
二、解题思路
数组判断
数组判断
代码如下:
class Solution {
public boolean isValidSudoku(char[][] board) {
//判断这行已经是否有存在的值
boolean isExistRow[][]=new boolean[9][9];
//判断这列是否有存在的值
boolean isExistColum[][]=new boolean[9][9];
//记录某3*3宫格内 某位数组是否已经被摆放了
boolean block[][]=new boolean[9][9];
//然后开始遍历
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
//如果这是一个点的话
if(board[i][j]!='.'){
//说明是一个数值 -1是为了防止数组越界
int num=board[i][j]-'1';
/**
* 这里就假设 9*9的方格被分成了 9个block 每一个block是3*3
* 然后i代表行 j代表列 就相当于是判断i,j属于哪一个block
* 因为有三行 所以i/3就能确定这个在哪一行了 也就把数值确认好了在哪三个中的一个 而这里需要乘以三是因为
* block是这样排序的 0 1 2 3 4 5 6 7 8 所以当你在第二行的时候 你的i/3的结果应该是1 但是需要*3 这样结果等于3 才能表示你在第二行
* 因为第二行的都是 3 4 5 ,然后确认好行之后 就直接、3确认列即可
*/
int blockIndex=i/3*3+j/3;
//然后判断这个num在这行或者这列或者这个block存不存在
if(isExistColum[j][num]||isExistRow[i][num]||block[blockIndex][num])
return false;
//不然的话 就进行标记
isExistColum[j][num]=true;
isExistRow[i][num]=true;
block[blockIndex][num]=true;
}
}
}
//最终返回
return true;
}
}