Determine if a 9x9 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-9without repetition.
  2. Each column must contain the digits 1-9 without repetition.
  3. Each of the 9 3x3 sub-boxes of the grid must contain the digits 1-9 without repetition.


A partially filled sudoku which is valid.

The Sudoku board could be partially filled, where empty cells are filled with the character '.'.

Example 1:

Input:
[
["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:
[
  ["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.

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.
  • The given board contain only digits 1-9and the character '.'.
  • The given board size is always 9x9.

这道题让验证一个方阵是否为数独矩阵,想必数独游戏我们都玩过,就是给一个 9x9 大小的矩阵,可以分为9个 3x3 大小的矩阵,要求是每个小矩阵内必须都是1到9的数字不能有重复,同时大矩阵的横纵列也不能有重复数字,是一种很经典的益智类游戏,经常在飞机上看见有人拿着纸笔在填数,感觉是消磨时光的利器。这道题给了一个残缺的二维数组,让我们判断当前的这个数独数组是否合法,即要满足上述的条件。判断标准是看各行各列是否有重复数字,以及每个小的 3x3 的小方阵里面是否有重复数字,如果都无重复,则当前矩阵是数独矩阵,但不代表待数独矩阵有解,只是单纯的判断当前未填完的矩阵是否是数独矩阵。那么根据数独矩阵的定义,在遍历每个数字的时候,就看看包含当前位置的行和列以及 3x3 小方阵中是否已经出现该数字,这里需要三个 boolean 型矩阵,大小跟原数组相同,分别记录各行,各列,各小方阵是否出现某个数字,其中行和列标志下标很好对应,就是小方阵的下标需要稍稍转换一下,具体代码如下:

解法一:

class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
vector<vector<bool>> rowFlag(, vector<bool>());
vector<vector<bool>> colFlag(, vector<bool>());
vector<vector<bool>> cellFlag(, vector<bool>());
for (int i = ; i < ; ++i) {
for (int j = ; j < ; ++j) {
if (board[i][j] == '.') continue;
int c = board[i][j] - '';
if (rowFlag[i][c] || colFlag[c][j] || cellFlag[ * (i / ) + j / ][c]) return false;
rowFlag[i][c] = true;
colFlag[c][j] = true;
cellFlag[ * (i / ) + j / ][c] = true;
}
}
return true;
}
};

我们也可以对空间进行些优化,只使用一个 HashSet 来记录已经存在过的状态,将每个状态编码成为一个字符串,能将如此大量信息的状态编码成一个单一的字符串还是需要有些技巧的。对于每个1到9内的数字来说,其在每行每列和每个小区间内都是唯一的,将数字放在一个括号中,每行上的数字就将行号放在括号左边,每列上的数字就将列数放在括号右边,每个小区间内的数字就将在小区间内的行列数分别放在括号的左右两边,这样每个数字的状态都是独一无二的存在,就可以在 HashSet 中愉快地查找是否有重复存在啦,参见代码如下:

解法二:

class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
unordered_set<string> st;
for (int i = ; i < ; ++i) {
for (int j = ; j < ; ++j) {
if (board[i][j] == '.') continue;
string t = "(" + to_string(board[i][j]) + ")";
string row = to_string(i) + t, col = t + to_string(j), cell = to_string(i / ) + t + to_string(j / );
if (st.count(row) || st.count(col) || st.count(cell)) return false;
st.insert(row);
st.insert(col);
st.insert(cell);
}
}
return true;
}
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/36

类似题目:

Sudoku Solver

参考资料:

https://leetcode.com/problems/valid-sudoku/

https://leetcode.com/problems/valid-sudoku/discuss/15450/Shared-my-concise-Java-code

https://leetcode.com/problems/valid-sudoku/discuss/15472/Short%2BSimple-Java-using-Strings

LeetCode All in One 题目讲解汇总(持续更新中...)

最新文章

  1. C语言的编译过程、安装gcc编译器以及设置环境变量
  2. CODE[VS] 1230 元素查找
  3. Spring AOP 四大通知
  4. AuthenticationManager.SignOut() 无法注销用户的问题
  5. http协议 301和302的原理及实现
  6. Unity3D DllNotFoundException/System.DllNotFoundException
  7. SublimeText为啥选择Python开发extension
  8. Java文件编码格式转换
  9. Package &#39;DXCore for Visual Studio&#39; has failed to load properly
  10. 【英文】Bingo口语笔记(18) - Cover系列
  11. MYSQL一对多,两表查询合并数据
  12. 第4章 流程控制----编写Java程序,使用while循环语句计算1+1/2!+1/3!+...+1/20!之和
  13. 浅谈!SQL语句中LEFT JOIN ON WHERE和LEFT JOIN ON AND的区别
  14. &quot;svn: E155010: 提交失败&quot;问题解决
  15. 产品研发管理(二):使用SubVersion进行代码管理
  16. Linux下实现秒级定时任务的两种方案(crontab 每秒运行)
  17. idea+scala sdk + scala插件
  18. Opencv-python画图基础知识
  19. GCC编译器原理(一)------GCC 工具:addr2line、ar、as、c++filt和elfedit
  20. postfix配置spf认证和dkim认证

热门文章

  1. 打造高效前端工作环境 - tmux
  2. 我是如何进行Spring MVC文档翻译项目的环境搭建、项目管理及自动化构建工作的
  3. Open DS
  4. 【转】Django Model field reference学习总结
  5. FastDFS 安装及使用
  6. js实现toggleClass
  7. ip命令和ifconfig命令(转载)
  8. Scala override
  9. 转载一篇React native的props的用法
  10. android MD5加密