题目

Determine if a 9 x 9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:

1.Each row must contain the digits 1-9 without repetition.

2.Each column must contain the digits 1-9 without repetition.

3.Each of the nine 3 x 3 sub-boxes of the grid must contain the digits 1-9 without repetition.

Note:

  • A Sudoku board (partially filled) could be valid but is not necessarily solvable.
  • Only the filled cells need to be validated according to the mentioned rules.

Example 1:

  1. Input: board =
  2. [["5","3",".",".","7",".",".",".","."]
  3. ,["6",".",".","1","9","5",".",".","."]
  4. ,[".","9","8",".",".",".",".","6","."]
  5. ,["8",".",".",".","6",".",".",".","3"]
  6. ,["4",".",".","8",".","3",".",".","1"]
  7. ,["7",".",".",".","2",".",".",".","6"]
  8. ,[".","6",".",".",".",".","2","8","."]
  9. ,[".",".",".","4","1","9",".",".","5"]
  10. ,[".",".",".",".","8",".",".","7","9"]]
  11. Output: true

Example 2:

  1. Input: board =
  2. [["8","3",".",".","7",".",".",".","."]
  3. ,["6",".",".","1","9","5",".",".","."]
  4. ,[".","9","8",".",".",".",".","6","."]
  5. ,["8",".",".",".","6",".",".",".","3"]
  6. ,["4",".",".","8",".","3",".",".","1"]
  7. ,["7",".",".",".","2",".",".",".","6"]
  8. ,[".","6",".",".",".",".","2","8","."]
  9. ,[".",".",".","4","1","9",".",".","5"]
  10. ,[".",".",".",".","8",".",".","7","9"]]
  11. Output: false
  12. Explanation: Same as Example 1, except with the 5 in the top left corner being modified to 8. Since there are two 8's in the top left 3x3 sub-box, it is invalid.

Constraints:

  • board.length == 9
  • board[i].length == 9
  • board[i][j] is a digit 1-9 or '.'.

思路

方法1 (Java)

设置一个Set集合,遍历数独表二维数组,将当前遍历到的位置的元素以3个字符串形式记录下它所在的行,列和九宫格信息,并加入Set集合。若Set集合中存在某一元素的任意行/列/九宫格信息,则认为该表不符合规则。

设当前元素值为val,位置为(i, j),位于第i/3*3+j/3个九宫格(从0开始),则该元素的信息可以设置为:

行信息:"val in row i"

列信息:"val in col j"

九宫格信息:"val in box i/3*3+j/3"

  1. class Solution {
  2. public boolean isValidSudoku(char[][] board) {
  3. HashSet<String> set = new HashSet<>();
  4. for(int i = 0; i < 9; i++){
  5. for(int j = 0; j < 9; j++){
  6. if(board[i][j] == '.') continue;
  7. String row = board[i][j] + " in row " + i;
  8. String col = board[i][j] + " in col " + j;
  9. String box = board[i][j] + " in box " + (i/3*3+j/3);
  10. if(set.contains(row) || set.contains(col) || set.contains(box)) return false;
  11. set.add(row);
  12. set.add(col);
  13. set.add(box);
  14. }
  15. }
  16. return true;
  17. }
  18. }

方法2(Java)

0-8,对每一个i,设置3个boolean数组分别检测第i行、第i列和第i个九宫格,数组的index代表被检测的值。

对于每个i的值,j0-8意味着检测:

i行, 第j个数是否已位于行i中;

i列,第j个数是否已位于列i中;

i个九宫格中,该九宫格从左上角到右下角的第j数是否已位于该九宫格中。

 

设置3个数组,

boolean[] checkRow 检查位置(i, j)的值是否已存在第i行

boolean[] checkCol 检查位置(j, i)的值是否已存在第i列

boolean[] checkBox 检查位置(i/3*3+j/3, j%3*3+j%3)的值是否已存在第i个九宫格中

  1. 例如当i4j0-8,对应行、列、九宫格的遍历过程
  2. 0 1 2 3 4 5 6 7 8
  3. 0 o o o | o 1 o | o o o
  4. 1 o o o | o 2 o | o o o
  5. 2 o o o | o 3 o | o o o
  6. ------------------------
  7. 3 o o o | o 4 o | o o o
  8. 4 1 2 3 | 4 5 6 | 7 8 9
  9. 5 o o o | o 6 o | o o o
  10. ------------------------
  11. 6 o o o | o 7 o | o o o
  12. 7 o o o | o 8 o | o o o
  13. 8 o o o | o 9 o | o o o
  14. 4个九宫格中
  15. 1 2 3
  16. 4 5 6
  17. 7 8 9
  1. class Solution {
  2. public boolean isValidSudoku(char[][] board) {
  3. for(int i = 0; i < 9; i++){
  4. boolean[] checkRow = new boolean[9];
  5. boolean[] checkCol = new boolean[9];
  6. boolean[] checkBox = new boolean[9];
  7. for(int j = 0; j < 9; j++){
  8. if(board[i][j] == '.') {}
  9. else if(checkRow[board[i][j]-'1']) return false;
  10. else checkRow[board[i][j]-'1'] = true;
  11. if(board[j][i] == '.'){}
  12. else if(checkCol[board[j][i]-'1']) return false;
  13. else checkCol[board[j][i]-'1'] = true;
  14. int m = i/3*3+j/3, n = i%3*3+j%3;
  15. if(board[m][n] == '.'){}
  16. else if(checkBox[board[m][n]-'1']) return false;
  17. else checkBox[board[m][n]-'1'] = true;
  18. }
  19. }
  20. return true;
  21. }
  22. }

LeetCode 36. Valid Sudoku (Medium)的更多相关文章

  1. LeetCode:36. Valid Sudoku,数独是否有效

    LeetCode:36. Valid Sudoku,数独是否有效 : 题目: LeetCode:36. Valid Sudoku 描述: Determine if a Sudoku is valid, ...

  2. 蜗牛慢慢爬 LeetCode 36.Valid Sudoku [Difficulty: Medium]

    题目 Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could ...

  3. LeetCode 36 Valid Sudoku

    Problem: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board ...

  4. Java [leetcode 36]Valid Sudoku

    题目描述: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board cou ...

  5. leetCode 36.Valid Sudoku(有效的数独) 解题思路和方法

    Valid Sudoku Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku bo ...

  6. [LeetCode] 36. Valid Sudoku 验证数独

    Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to th ...

  7. [leetcode]36. Valid Sudoku验证数独

    Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to th ...

  8. LeetCode 36. Valid Sudoku (C++)

    题目: Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according t ...

  9. LeetCode 36 Valid Sudoku(合法的数独)

    题目链接: https://leetcode.com/problems/valid-sudoku/?tab=Description   给出一个二维数组,数组大小为数独的大小,即9*9  其中,未填入 ...

随机推荐

  1. linux 系统ssh超时设置

    1.修改client端的etc/ssh/ssh_config添加以下:(在没有权限改server配置的情形下) ServerAliveInterval 60 #client每隔60秒发送一次请求给se ...

  2. [hdu7065]Yinyang

    将一个格子看作一个节点,相邻(有公共边)的同色格子之间连边,那么由前两个条件即要求图恰被分为两个非空连通块(由于$n,m\ge 3$,显然不能不使用某种颜色) 下面,来分析图中的简单环,其对应于网格图 ...

  3. 力扣 - 剑指 Offer 55 - I. 二叉树的深度

    题目 剑指 Offer 55 - I. 二叉树的深度 思路1(DFS) 后续遍历吧,先遍历到最深(递归到末尾返回0),然后从后面一步一步比较取大的值返回,每次返回层数都加1, 执行流程是怎样的:比如其 ...

  4. java的String参数格式化

    String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重载形式. form ...

  5. 解决texlive化学式转换镜像经常偶发性进程堆积导致卡顿问题

    前言 之前在 使用Python定时清理运行超时的pdflatex僵尸进程 博文中我采用python脚本开启定时任务清理pdflatex僵尸进程,线上4u2G的k8s pod部署了3个,pdflatex ...

  6. [ARC 122]

    最近状态差到爆炸. \(AT\)连掉两把分,啥时候能上黄啊. \(A\) 考虑直接动归. 把\(O(n^2)\)的动归后缀和优化成\(O(n)\) A #include<iostream> ...

  7. 洛谷 P5224 - Candies(循环卷积)

    洛谷题面传送门 一道题解长度大概不到 1k 的题,可还是决定写篇题解,因为自己没有做出来( \(1004535809\) 好评( 首先这个 \(\equiv m\pmod{k}\) 有点把我们往单位根 ...

  8. C++匿名函数的使用

    c++匿名函数使用方法 1.匿名函数的使用 匿名函数的基本语法为: //[捕获列表](参数列表)->返回类型{函数体} int main() { auto Add = [](int a, int ...

  9. WPS for Linux 字体配置(字体缺失解决办法)

    WPS for Linux 字体配置(字体缺失解决办法) 1. 背景 有些linux装完wps后提示"部分字体无法显示"或"some formula symbols mi ...

  10. Matlab矢量图图例函数quiverkey

    Matlab自带函数中不包含构造 quiver 函数注释过程,本文参照 matplotlib 中 quiverkey 函数,构造类似函数为 Matlab 中 quiver 矢量场进行标注. quive ...