LeetCode 图解 | 36.有效的数独

时光总嘲笑我的痴心妄想 提交于 2021-02-16 19:29:17

点击关注上方“图解面试算法”,

设为“置顶或星标”,一起刷 LeetCode。

作者:孤磊



题目来源于 LeetCode 第 36 号问题:有效的数独.

题目

判断一个 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源创计划”,欢迎正在阅读的你也加入,一起分享。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!