leetcode之Valid Sudoku有效的数独(一步步改进代码)
题目链接: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有效的数独(一步步改进代码)相关推荐
- LeetCode 36. Valid Sudoku(九宫格数独)
依次检查每行,每列,每个子九宫格是否出现重复元素,如果出现返回false,否则返回true. 难点在于表示第i个九宫格每个格点的坐标. 观察行号规律: 第0个九宫格:000111222; 第1个九宫格 ...
- LeetCode 36 Valid Sudoku(有效数独)(*)
翻译 数独板被部分填充,空格部分用'.'来填充.一个部分填充的数组是否有效只需要看其填充的部分即可. 原文 代码 这道题写了一会,错了--因为输入太懒搞了,就直接看了别人写的-- class Solu ...
- LeetCode 36. Valid Sudoku
LeetCode 36. Valid Sudoku Solution1:我的答案,比较笨.但是清晰易懂好上手啊~~~ class Solution { public:bool isValidSudok ...
- leetcode 36. Valid Sudoku | 37. Sudoku Solver(数独)
36. Valid Sudoku https://leetcode.com/problems/valid-sudoku/ 题解 class Solution {public boolean isVal ...
- [leetcode]36. Valid Sudoku c语言
题目 Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could ...
- Java for LeetCode 036 Valid Sudoku
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...
- LeetCode T36 Valid Sudoku
文章目录 题目地址 题目描述 思路 题解 题目地址 中文:https://leetcode-cn.com/problems/valid-sudoku/ 英文:https://leetcode.com/ ...
- Leetcode36.Valid Sudoku有效的数独
判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔的 ...
- 36. Valid Sudoku数独判断
题目:数独填写正确判断 https://leetcode.com/problems/valid-sudoku/description/ Determine if a Sudoku is valid, ...
最新文章
- 传递函数极点与微分方程的解
- 独家 | 别用csv存储了-这种文件格式比csv快150倍(附链接)
- #linux进阶#归档压缩
- 让bat异常之后不直接关闭窗口的办法.
- EF-InvalidOperation系列
- 日期与时间(C/C++)
- 巧用FlashPaper 让Word文档变Flash
- java excel导出 模板_Java Excel 导出 模板
- php输出图片问题,解决ThinkPHP里无法输出图片问题(关于设置响应头)
- 荐书 | 抑郁症的自助手册,觉察自我的钥匙
- 直播视频流+html,前端页面播放 rtmp 流与 flv 格式视频文件
- 语音质量评价和可懂度评价
- 软件项目管理_作业1
- 蘑菇街 java 面试_【蘑菇街java工程师面试】蘑菇街Java后台开发二面挫败-看准网...
- NAACL2021阅读理解论文整理
- 【CTO讲堂】企业该如何打造自身的“安全免疫系统”?
- 程序猿的世界~~~~
- QuickSDK-手游出海服务器接入技巧
- 计算机组成原理学习笔记————计算机指令,MIPS指令集,存储器操作数,数据传送指令,取数存数指令
- Ubuntu数据备份与恢复工具(一)