题目:
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.
链接: http://leetcode.com/problems/valid-sudoku/
题解:
验证数独,分三次验证行,列以及9个3x3子块就可以了。
Time Complexity - O(n2), Space Complexity - O(1)。
public class Solution { public boolean isValidSudoku(char[][] board) { if(board == null || board.length == 0) return false; HashSet<Character> set = new HashSet<Character>(); for(int i = 0; i < 9; i++) { for(int j = 0; j < 9; j++) { if(board[i][j] != '.' && 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] != '.' && set.contains(board[i][j])) return false; set.add(board[i][j]); } set.clear(); } for(int i = 1; i < 9; i += 3) { for(int j = 1; j < 9; j += 3) { for(int k = -1; k <= 1; k++) { for(int l = -1; l <= 1; l++) { if(board[i + k][j + l] != '.' && set.contains(board[i + k][j + l])) return false; set.add(board[i + k][j + l]); } } set.clear(); } } return true; } }
二刷:
Java:
依然是 Time Complexity - O(n2) , Space Complexity - O(1)。这样遍历了三次数组,并不是很快,可以继续优化,只遍历一次数组。
public class Solution { public boolean isValidSudoku(char[][] board) { if (board == null || board.length == 0) { return false; } Set<Character> set = new HashSet<>(); for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[0].length; j++) { if (board[i][j] != '.' && !set.add(board[i][j])) { return false; } } set.clear(); } for (int j = 0; j < board[0].length; j++) { for (int i = 0; i < board.length; i++) { if (board[i][j] != '.' && !set.add(board[i][j])) { return false; } } set.clear(); } for (int i = 1; i < board.length; i += 3) { for (int j = 1; j < board[0].length; j += 3) { for (int k = -1; k <= 1; k++) { for (int l = -1; l <= 1; l++) { if (board[i + k][j + l] != '.' && !set.add(board[i + k][j + l])) { return false; } } } set.clear(); } } return true; } }
只遍历一次数组,代码主要来自于Lorraine921:
public class Solution { public boolean isValidSudoku(char[][] board) { if (board == null || board.length == 0) { return false; } Set<Character> rows = new HashSet<Character>(); Set<Character> cols = new HashSet<Character>(); Set<Character> cube = new HashSet<Character>(); for(int i = 0; i < 9; i++){ for (int j = 0; j < 9;j++){ if(board[i][j] != '.' && !rows.add(board[i][j])) { return false; } if(board[j][i] != '.' && !cols.add(board[j][i])) { return false; } int RowIndex = 3 * (i / 3); int ColIndex = 3 * (i % 3); if(board[RowIndex + j / 3][ColIndex + j % 3]!= '.' && !cube.add(board[RowIndex + j / 3][ColIndex + j % 3])) { return false; } } rows.clear(); cols.clear(); cube.clear(); } return true; } }
三刷:
看来三刷并没有吸取到二刷的精华,上面的解法完全忘记了。需要再领会。
Java:
public class Solution { public boolean isValidSudoku(char[][] board) { // assume len = 9 if (board == null || board.length == 0) { return false; } Set<Integer> set = new HashSet<>(); for (int i = 0; i < 9; i++) { set.clear(); for (int j = 0; j < 9; j++) { if (board[i][j] != '.' && !set.add(board[i][j] - '0')) { return false; } } } for (int j = 0; j < 9; j++) { set.clear(); for (int i = 0; i < 9; i++) { if (board[i][j] != '.' && !set.add(board[i][j] - '0')) { return false; } } } for (int i = 1; i < 9; i += 3) { for (int j = 1; j < 9; j += 3) { set.clear(); for (int k = -1; k <= 1; k++) { for (int l = -1; l <= 1; l++) { if (board[i + k][j + l] != '.' && !set.add(board[i + k][j + l] - '0')) { return false; } } } } } return true; } }
Reference:
https://leetcode.com/discuss/48737/1-7-lines-python-4-solutions
https://leetcode.com/discuss/27272/shared-my-concise-java-code
https://leetcode.com/discuss/23901/my-short-solution-by-c-o-n2
https://leetcode.com/discuss/17990/sharing-my-easy-understand-java-solution-using-set
https://leetcode.com/discuss/92445/yet-another-java-2ms-solution