题目地址:
https://leetcode.com/problems/valid-sudoku/
检测数独是否合法。直接按照定义检测就好了。
import java.util.Arrays;
public class Solution {
public boolean isValidSudoku(char[][] board) {
for (int i = 0; i < 9; i++) {
if (!checkRowColumn(board, i, i)) {
return false;
}
}
for (int i = 0; i < 9; i += 3) {
for (int j = 0; j < 9; j += 3) {
if (!checkBlock(board, i, j)) {
return false;
}
}
}
return true;
}
boolean checkRowColumn(char[][] board, int i, int j) {
int[] count = new int[9];
int index = 0;
for (int k = 0; k < 9; k++) {
if (board[i][k] == '.') {
continue;
}
index = board[i][k] - '1';
count[index]++;
if (count[index] >= 2) {
return false;
}
}
Arrays.fill(count, 0);
for (int k = 0; k < 9; k++) {
if (board[k][j] == '.') {
continue;
}
index = board[k][j] - '1';
count[index]++;
if (count[index] >= 2) {
return false;
}
}
return true;
}
boolean checkBlock(char[][] board, int i, int j) {
int[] count = new int[9];
int index = 0;
for (int k = i; k < i + 3; k++) {
for (int l = j; l < j + 3; l++) {
if (board[k][l] == '.') {
continue;
}
index = board[k][l] - '1';
count[index]++;
if (count[index] >= 2) {
return false;
}
}
}
return true;
}
}
时间复杂度 O ( 9 2 ∗ 9 3 ) = O ( 1 ) O(9^2*9^3)=O(1) O(92∗93)=O(1),最多 9 2 9^2 92个数,每个数检测 9 3 9^3 93遍,本质是常数复杂度,毕竟数独大小是固定的。空间 O ( 9 ) = O ( 1 ) O(9)=O(1) O(9)=O(1)。