点击关注上方“图解面试算法”,
设为“置顶或星标”,一起刷 LeetCode。

作者:孤磊
题目
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
示例 1:
输入:[["5","3",".",".","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"]]输出: true
示例 2:
输入:[["8","3",".",".","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"]]输出: false解释: 除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。
示例 3:
输入: [1,3,5,6], 7输出: 4
示例 4:
输入: [1,3,5,6], 0输出: 0
思路解析
这道题因为需要判断数值是否存在,所以用 Hash Map 是一个很好的选择。因为每一行、每一列、每一格都是需要单独进行判断的,所以需要建立三个长度为9的HashMap数组,分别存放行、列、格的数值。
通过一个二层循环遍历这个 9*9 的数组,把当前格的数值存放到对应的HashMap中,判断之前是否已经存放过了,如果已经存放过那就退出,返回 false,如果是.的话那就跳过,这样只需要遍历一边就可以了。
动画理解

代码实现
//时间复杂度:O(n)//空间复杂度:O(1)class Solution {public boolean isValidSudoku(char[][] board) {HashMap[] row = new HashMap[9];HashMap[] column = new HashMap[9];HashMap[] box = new HashMap[9];for (int i = 0; i < 9; i++) {row[i] = new HashMap(9);column[i] = new HashMap(9);box[i] = new HashMap(9);}for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {if (board[i][j] == '.') {continue;}int boxIndex=i / 3 * 3 + j / 3;if ((boolean) row[i].getOrDefault(board[i][j], true)) {return false;}if ((boolean) column[j].getOrDefault(board[i][j], true)) {return false;}if ((boolean) box[boxIndex].getOrDefault(board[i][j], true)) {return false;}row[i].put(board[i][j], false);column[j].put(board[i][j], false);box[boxIndex].put(board[i][j], false);}}return true;}}
推荐阅读
• LeetCode 图解 | 35.搜索插入位置• LeetCode 图解 | 202.快乐数• LeetCode 图解 | 34.在排序数组中查找元素的第一个和最后一个位置• LeetCode 图解 | 617.合并二叉树• LeetCode 图解 | 55 . 跳跃游戏• LeetCode 图解 | 771 . 宝石与石头• LeetCode 图解 | 48 . 旋转图像
欢迎关注我的公众号“图解面试算法”,如果喜欢,麻烦点一下“在看”~

本文分享自微信公众号 - 五分钟学算法(CXYxiaowu)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/4010368/blog/4382493