题目链接:Valid Sudoku有效的数独

题目已经十分确定的说了只有1~9,因此标记法无疑是非常好的选择。

基本思路:对行、列、小数独块分别用一个size为9的数组来标记数字1~9在本行(列/块)中是否已使用。

根据思路则不难写出下面的代码:

 public static int startIndex = 0;public static int sudokuSize = 9;public boolean isValidSudoku(char[][] board) {int i;boolean[][] mark = new boolean[sudokuSize][sudokuSize+1];// 判断所有行是否符合for (i = startIndex; i < sudokuSize; i++) {for (int j = startIndex; j < sudokuSize; j++) {if (board[i][j] != '.') {int temp = board[i][j] - '0';if (mark[i][temp]) return false;else mark[i][temp] = true;}}}// 判断所有列是否符合initMarkArr(mark, false);for (i = startIndex; i < sudokuSize; i++) {for (int j = startIndex; j < sudokuSize; j++) {if (board[j][i] != '.') {int temp = board[j][i] - '0';if (mark[i][temp]) return false;else mark[i][temp] = true;}}}// 判断所有小数独块是否符合initMarkArr(mark, false);for (i = startIndex; i < sudokuSize; i++) {for (int j = startIndex; j < sudokuSize; j++) {int index = i/3 * 3 + j/3;if (board[j][i] != '.') {int temp = board[j][i] - '0';if (mark[index][temp]) return false;else mark[index][temp] = true;}}}return true;}// 初始化数组public void initMarkArr(boolean[][] arr, boolean value) {for (int j = 0; j < arr.length; j++) {Arrays.fill(arr[j], value);}}

代码看起来有点冗余,我们稍作代码简化,可得如下代码

    public boolean isValidSudoku(char[][] board) {boolean[][] markRow = new boolean[9][10];boolean[][] markCol = new boolean[9][10];boolean[][] markBlock = new boolean[9][10];// 多定义两个数组可以省去初始化操作for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {int index = i/3 * 3 + j/3;if (board[j][i] != '.') {int temp = board[j][i] - '0';if (markRow[j][temp]) return false;else markRow[j][temp] = true;if (markCol[i][temp]) return false;else markCol[i][temp] = true;if (markBlock[index][temp]) return false;else markBlock[index][temp] = true;}}}return true;}

对于此题,似乎没法靠优化算法来提升效率,硬要优化的话,可以在位运算上下点功夫。

    public boolean isValidSudoku(char[][] board) {int[][] mark = new int[3][9];for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {int index = i/3 * 3 + j/3;if (board[j][i] != '.') {// 1左移?位,数独中最大数为9,2^8大大小于int的maxint temp = 1 << (board[j][i] - '1');// 判断每列是否出现重复用temp,否则|上tempif ((mark[0][j] & temp) > 0) return false;else mark[0][j] |= temp;// 每行if ((mark[1][i] & temp) > 0) return false;else mark[1][i] |= temp;//每块if ((mark[2][index] & temp) > 0) return false;else mark[2][index] |= temp;}}}return true;}

进一步简化代码

    public boolean isValidSudoku(char[][] board) {int[][] mark = new int[3][9];for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {int index = i/3 * 3 + j/3;if (board[j][i] != '.') {int temp = 1 << (board[j][i] - '1');if ((mark[0][j] & temp) > 0 || (mark[1][i] & temp) > 0 || (mark[2][index] & temp) > 0) return false;mark[0][j] |= temp;mark[1][i] |= temp;mark[2][index] |= temp;}}}return true;}

leetcode之Valid Sudoku有效的数独(一步步改进代码)相关推荐

  1. LeetCode 36. Valid Sudoku(九宫格数独)

    依次检查每行,每列,每个子九宫格是否出现重复元素,如果出现返回false,否则返回true. 难点在于表示第i个九宫格每个格点的坐标. 观察行号规律: 第0个九宫格:000111222; 第1个九宫格 ...

  2. LeetCode 36 Valid Sudoku(有效数独)(*)

    翻译 数独板被部分填充,空格部分用'.'来填充.一个部分填充的数组是否有效只需要看其填充的部分即可. 原文 代码 这道题写了一会,错了--因为输入太懒搞了,就直接看了别人写的-- class Solu ...

  3. LeetCode 36. Valid Sudoku

    LeetCode 36. Valid Sudoku Solution1:我的答案,比较笨.但是清晰易懂好上手啊~~~ class Solution { public:bool isValidSudok ...

  4. leetcode 36. Valid Sudoku | 37. Sudoku Solver(数独)

    36. Valid Sudoku https://leetcode.com/problems/valid-sudoku/ 题解 class Solution {public boolean isVal ...

  5. [leetcode]36. Valid Sudoku c语言

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

  6. Java for LeetCode 036 Valid Sudoku

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

  7. LeetCode T36 Valid Sudoku

    文章目录 题目地址 题目描述 思路 题解 题目地址 中文:https://leetcode-cn.com/problems/valid-sudoku/ 英文:https://leetcode.com/ ...

  8. Leetcode36.Valid Sudoku有效的数独

    判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔的 ...

  9. 36. Valid Sudoku数独判断

    题目:数独填写正确判断 https://leetcode.com/problems/valid-sudoku/description/ Determine if a Sudoku is valid, ...

最新文章

  1. 传递函数极点与微分方程的解
  2. 独家 | 别用csv存储了-这种文件格式比csv快150倍(附链接)
  3. #linux进阶#归档压缩
  4. 让bat异常之后不直接关闭窗口的办法.
  5. EF-InvalidOperation系列
  6. 日期与时间(C/C++)
  7. 巧用FlashPaper 让Word文档变Flash
  8. java excel导出 模板_Java Excel 导出 模板
  9. php输出图片问题,解决ThinkPHP里无法输出图片问题(关于设置响应头)
  10. 荐书 | 抑郁症的自助手册,觉察自我的钥匙
  11. 直播视频流+html,前端页面播放 rtmp 流与 flv 格式视频文件
  12. 语音质量评价和可懂度评价
  13. 软件项目管理_作业1
  14. 蘑菇街 java 面试_【蘑菇街java工程师面试】蘑菇街Java后台开发二面挫败-看准网...
  15. NAACL2021阅读理解论文整理
  16. 【CTO讲堂】企业该如何打造自身的“安全免疫系统”?
  17. 程序猿的世界~~~~
  18. QuickSDK-手游出海服务器接入技巧
  19. 计算机组成原理学习笔记————计算机指令,MIPS指令集,存储器操作数,数据传送指令,取数存数指令
  20. Ubuntu数据备份与恢复工具(一)

热门文章

  1. 神策数据与达观数据达成战略合作,共拓大数据服务市场
  2. 解决安装DEB包时报错
  3. 《码出高效:Java 开发手册》正式发布,83行代码计划启动
  4. Cisco无线AP上联口为trunk时无法注册故障处理
  5. ArcGIS几种数据格式2
  6. markdown--入门
  7. ObjC: Foundation Kit
  8. FetchAI Case Study
  9. Career Essentials from Career Service
  10. success or not?