36. Valid Sudoku
来源:互联网 发布:柱状图数据ae模板 编辑:程序博客网 时间:2024/06/16 08:52
36. Valid Sudoku
题目
依据数独问题——规则Sudoku Puzzles - The Rules 来判断一个数独是否合法。
数独可以被部分填充,空的单元用字符‘.’来填充。
部分填充的有效数独。
注:
有效的(部分填充的)数独不必全部解出来。只要验证已填充的单元是有效的就可以。
代码块
public class Solution { static boolean isValidSudoku(char[][] board) { if(checkRow(board) && checkCol(board) && checkSub(board)) return true; return false; } static boolean checkRow(char[][] board) { for(int i = 0; i < 9; i++){ HashSet<Character> hs = new HashSet<Character>(); for(int j = 0; j < 9; j++){ if(board[i][j] != '.'){ if(hs.contains(board[i][j])) return false; else{ hs.add(board[i][j]); } } } } return true; } static boolean checkCol(char[][] board){ for(int i = 0; i < 9; i++){ HashSet<Character> hs = new HashSet<Character>(); for(int j = 0; j < 9; j++){ if(board[j][i] != '.'){ if(hs.contains(board[j][i])){ return false; }else{ hs.add(board[j][i]); } } } } return true; } static boolean checkSub(char[][] board){ for(int k = 0; k < 9 ; k++){ int row = (k / 3) * 3; int col = (k % 3) * 3; HashSet<Character> hs = new HashSet<Character>(); for(int i = 0; i < 3; i++){ for(int j = 0; j < 3; j++){ if(board[row + i][col + j] != '.'){ if(hs.contains(board[row + i][col + j])){ return false; }else{ hs.add(board[row + i][col + j]); } } } } } return true; } public static void main(String[] args) {// char[][] board = {// {'.','.','.','.','5','.','.','1','.'},// {'.','4','.','3','.','.','.','.','.'},// {'.','.','.','.','.','3','.','.','1'},// {'8','.','.','.','.','.','.','2','.'},// {'.','.','2','.','7','.','.','.','.'},// {'.','1','5','.','.','.','.','.','.'},// {'.','.','.','.','.','2','.','.','.'},// {'.','2','.','9','.','.','.','.','.'},// {'.','.','4','.','.','.','.','.','.'}};// char[][] board = {{'5', '5', '.', '.', '7', '.', '.', '.', '.'},// {'6', '.', '.', '1', '9', '5', '.', '.', '.'},// {'.', '9', '8', '.', '.', '.', '.', '6', '.'},// {'8', '.', '.', '.', '6', '.', '.', '.', '3'},// {'4', '.', '.', '8', '.', '3', '.', '.', '1'},// {'7', '.', '.', '.', '2', '.', '.', '.', '6'},// {'.', '6', '.', '.', '.', '.', '2', '8', '.'},// {'.', '.', '.', '4', '1', '9', '.', '.', '5'},// {'.', '.', '.', '.', '.', '8', '.', '7', '9'}}; char[][] board = { {'.','.','4','.','.','.','6','3','.'}, {'.','.','.','.','.','.','.','.','.'}, {'5','.','.','.','.','.','.','9','.'}, {'.','.','.','5','6','.','.','.','.'}, {'4','.','3','.','.','.','.','.','1'}, {'.','.','.','7','.','.','.','.','.'}, {'.','.','.','5','.','.','.','.','.'}, {'.','.','.','.','.','.','.','.','.'}, {'.','.','.','.','.','.','.','.','.'}}; System.out.println(isValidSudoku(board)); } }
代码分析
判断数独是否合法,需要判断每排,每列,每一个block是否合法,本题运用到了hashset,来判断是否是一个合法的数组。
首先需要看是否不等于’.’(因为空的不做判断),然后看是否包含重复的元素,
1)如果包括,就返回false,
2)如果不是,就添加到哈希集中。
判断每行,每列都是类似的方法,只是判断block时需要注意一下每个元素的索引。
所以 int row = (k / 3) * 3;
int col = (k % 3) * 3;
[row + i ]
[col + j ]。
阅读全文
0 0
- [LeetCode]36.Valid Sudoku
- 36. Valid Sudoku
- LeetCode --- 36. Valid Sudoku
- LeetCode 36.Valid Sudoku
- [Leetcode] 36. Valid Sudoku
- 36. Valid Sudoku
- 【leetcode】36. Valid Sudoku
- 36. Valid Sudoku
- 36. Valid Sudoku
- [leetcode] 36. Valid Sudoku
- Leetcode 36. Valid Sudoku
- 36. Valid Sudoku
- 36. Valid Sudoku LeetCode
- 36. Valid Sudoku
- 36. Valid Sudoku
- 36. Valid Sudoku
- 36. Valid Sudoku
- 36. Valid Sudoku
- Apriori算法进行关联分析(2)
- 7-9 还原二叉树(25 point(s))(根据前序遍历和中序遍历建树)
- 2.5 寻找最大的K个数
- 【数据库基础】详解函数依赖与键【码】
- 习题 6.13
- 36. Valid Sudoku
- 最小堆及基于最小堆的最小优先队列
- matlab
- Mybatis学习笔记(七)【输入映射】
- HDU
- linux 系统下zookeeper的安装和配置
- Mybatis学习笔记(八)【输出映射】
- 让我们hook一个库函数
- Unity Editor编辑器(MenuItem)