题目

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:

Input: board =
[["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"]]
Output: true

Example 2:

Input: board =
[["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"]]
Output: false
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"

class Solution {
public boolean isValidSudoku(char[][] board) {
HashSet<String> set = new HashSet<>();
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
if(board[i][j] == '.') continue;
String row = board[i][j] + " in row " + i;
String col = board[i][j] + " in col " + j;
String box = board[i][j] + " in box " + (i/3*3+j/3);
if(set.contains(row) || set.contains(col) || set.contains(box)) return false;
set.add(row);
set.add(col);
set.add(box);
}
}
return true;
}
}

方法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个九宫格中

例如当i为4,j从0-8,对应行、列、九宫格的遍历过程

  0 1 2   3 4 5   6 7 8
0 o o o | o 1 o | o o o
1 o o o | o 2 o | o o o
2 o o o | o 3 o | o o o
------------------------
3 o o o | o 4 o | o o o
4 1 2 3 | 4 5 6 | 7 8 9
5 o o o | o 6 o | o o o
------------------------
6 o o o | o 7 o | o o o
7 o o o | o 8 o | o o o
8 o o o | o 9 o | o o o 第4个九宫格中
1 2 3
4 5 6
7 8 9
class Solution {
public boolean isValidSudoku(char[][] board) {
for(int i = 0; i < 9; i++){
boolean[] checkRow = new boolean[9];
boolean[] checkCol = new boolean[9];
boolean[] checkBox = new boolean[9];
for(int j = 0; j < 9; j++){
if(board[i][j] == '.') {}
else if(checkRow[board[i][j]-'1']) return false;
else checkRow[board[i][j]-'1'] = true; if(board[j][i] == '.'){}
else if(checkCol[board[j][i]-'1']) return false;
else checkCol[board[j][i]-'1'] = true; int m = i/3*3+j/3, n = i%3*3+j%3;
if(board[m][n] == '.'){}
else if(checkBox[board[m][n]-'1']) return false;
else checkBox[board[m][n]-'1'] = true;
}
}
return true;
}
}

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. web页面自动化总结。selenium

    web自动化测试终篇:总结我理解的ui自动化,整理归纳: https://blog.csdn.net/CCGGAAG/article/details/89669592 web页面自动化知识点 1.we ...

  2. php 递推 递归

    思想:如何利用数学模式,来解决对应的需求问题,然后利用代码实现对应的数据模型(逻辑) 算法:使用代码实现对应的数学模型,从而解决对应的业务问题 递推算法是一种简单的算法,级通过已知条件,利用特定关系得 ...

  3. C/C++ QT QChart 绘制组件应用

    QtCharts 组件是QT中提供图表绘制的模块,该模块可以方便的绘制常规图形,Qtcharts 组件基于GraphicsView模式实现,其核心是QChartView和QChart的二次封装版. 在 ...

  4. shell脚本训练

    *注:shell中的/data目录为自创练习目录 1,编写脚本systeminfo.sh,显示当前主机系统信息.包括主机名,IPV4地址,操作系统版本,内核版本,cpu型号,内存大小,硬盘大小 结果: ...

  5. [hdu7082]Pty loves lcm

    先将问题差分,即仅考虑上限$R$(和$L-1$) 注意到$f(x,y)$增长是较快的,对其分类讨论: 1.若$y\ge x+2$,此时满足$f(x,y)\le 10^{18}$的$(x,y)$只有约$ ...

  6. tomcat去除项目访问路径限制

    首先打开tomcat的\apache-tomcat-7.0.73\confserver.xml文件 在 </ <Host name="localhost" appBas ...

  7. 学军中学csp-noip2020模拟5

    Problem List(其实这几场全是附中出的) 这场比赛的题目相当有价值,特别是前两题,相当的巧妙. A.路径二进制 数据范围这么小,当然是搜索. \(30pts:\)大力搜索出奇迹,最后统计答案 ...

  8. 【基因组注释】ncRNA注释

    目录 1. ncRNA 2. 软件 tRNA注释 rRNA注释 其他ncRNA注释 3. 注释 tRNA rRNA snRNA.miRNA等 4. snRNA.miRNA等结果的统计 1. ncRNA ...

  9. 植物GO注释

    本文主要是对没有GO term库的植物进行注释. 1.选用AgriGo 进行注释,在agriGO中点击species后,查看与你目标物种相近的物种作为库 2.比如我以甜菜为例 为了找到和GO term ...

  10. SPI详解2

    串行外设接口 (SPI) 总线是一种运行于全双工模式下的同步串行数据链路.用于在单个主节点和一个或多个从节点之间交换数据. SPI 总线实施简单,仅使用四条数据信号线和控制信号线(请参见图 1). 图 ...