Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.
The Sudoku board could be partially filled, where empty cells are filled with the character
'.'
.
A partially filled sudoku which is valid.
Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.
首先按照每行chek 然后每列check 最后每个block 分别check
check的方法是维护一个hashset 如果是'.'就跳过 如果是char就看set中是否包含 如果包含就return false 不包含就把当前char放入set中
对于block的i j取法比较trick
k/ 3 * 3 ~ k / 3 * 3 + 2 是代表行数 k % 3 * 3 ~ k % 3 *3 + 2 是列数 这样对于每个k都可以表示一个block
时间复杂度 O(3*n^2)
时间复杂度 O(3*n^2)
public class Solution { public boolean isValidSudoku(char[][] board) { HashSet<Character> set = new HashSet<Character>(); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if (board[i][j] == '.') { continue; } if (set.contains(board[i][j])) { return false; } set.add(board[i][j]); } set.clear(); } for (int j = 0; j < 9; j++) { for (int i = 0; i < 9; i++) { if (board[i][j] == '.') { continue; } if (set.contains(board[i][j])) { return false; } set.add(board[i][j]); } set.clear(); } for (int k = 0; k < 9; k++) { for (int i = k / 3 * 3; i < k / 3 * 3 + 3; i ++) { for (int j = (k % 3) * 3; j < (k % 3) * 3 + 3; j++) { if (board[i][j] == '.') { continue; } if (set.contains(board[i][j])) { return false; } set.add(board[i][j]); } } set.clear(); } return true; } }
没有评论:
发表评论