微信公眾號(hào)移動(dòng)網(wǎng)站開(kāi)發(fā)windows優(yōu)化大師要會(huì)員
請(qǐng)你判斷一個(gè)?9 x 9
?的數(shù)獨(dú)是否有效。只需要?根據(jù)以下規(guī)則?,驗(yàn)證已經(jīng)填入的數(shù)字是否有效即可。
- 數(shù)字?
1-9
?在每一行只能出現(xiàn)一次。 - 數(shù)字?
1-9
?在每一列只能出現(xiàn)一次。 - 數(shù)字?
1-9
?在每一個(gè)以粗實(shí)線分隔的?3x3
?宮內(nèi)只能出現(xiàn)一次。(請(qǐng)參考示例圖)
注意:
- 一個(gè)有效的數(shù)獨(dú)(部分已被填充)不一定是可解的。
- 只需要根據(jù)以上規(guī)則,驗(yàn)證已經(jīng)填入的數(shù)字是否有效即可。
- 空白格用?
'.'
?表示。
思路一:普通人暴力法,使用哈希表
class Solution {public boolean isValidSudoku(char[][] board) {int rowSize = board.length;int cellSize = board[0].length;Set<Character> set = new HashSet<>();for(int i=0; i<rowSize; i++) {set.clear();for(int j=0; j<cellSize; j++) {char ele = board[i][j];if('.' != ele) {if(set.contains(ele)) {return false;}set.add(ele);}}}for(int i=0; i<cellSize; i++) {set.clear();for(int j=0; j<rowSize; j++) {char ele = board[j][i];if('.' != ele) {if(set.contains(ele)) {return false;}set.add(ele);}}}for(int i=0; i<3; i++) {for(int j=0; j<3; j++) {set.clear();for(int k=i*3;k<(i+1)*3;k++) {for(int q=j*3;q<(j+1)*3;q++) {char ele = board[k][q];if('.' != ele) {if(set.contains(ele)) {return false;}set.add(ele);}}}}}return true;}
}
思路二:數(shù)學(xué)方法
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 = 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;}
}
?