GitHub地址


题目

判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

  • 数字 1-9 在每一行只能出现一次。
  • 数字 1-9 在每一列只能出现一次。
  • 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

    上图是一个部分填充的有效的数独。
    数独部分空格内已填入了数字,空白格用 ‘.’ 表示。

示例

示例 1:

输入:

[['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']
]

输出: true

示例 2:

输入:

[['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']
]

输出: false

解释

除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。
但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。

说明

  • 一个有效的数独(部分已被填充)不一定是可解的。
  • 只需要根据以上规则,验证已经填入的数字是否有效即可。
  • 给定数独序列只包含数字 1-9 和字符 ‘.’ 。
  • 给定数独永远是 9x9 形式的。

代码

我的想法是创建2个新的char二维数组,分别存放列和九宫格的数据,然后通多list的remove方法,删除失败是返回false来判断有没有对应的元素。我的这个方法属于比较浪费空间的。击败了45%的小伙伴。

    public static boolean isValidSudoku(char[][] board) {Character[] strs = {'1', '2', '3', '4', '5', '6', '7', '8', '9'};char[][] board2 = new char[9][9];char[][] board3 = new char[9][9];ArrayList<Character> list = new ArrayList<>(Arrays.asList(strs));if (!isRemove(board, (ArrayList<Character>) list.clone())) {return false;}for (int i = 0; i < board.length; i++) {for (int j = 0; j < board[i].length; j++) {board2[i][j] = board[j][i];// 计算九宫格的行列下标int r = j / 3 + i / 3 * 3;int c = (j % 3 + i * 3) % 9;board3[r][c] = board[i][j];}}if (!isRemove(board2, (ArrayList<Character>) list.clone())) {return false;}if (!isRemove(board3, (ArrayList<Character>) list.clone())) {return false;}return true;}private static boolean isRemove(char[][] board, ArrayList<Character> list) {for (int i = 0; i < board.length; i++) {ArrayList<String> removeList = (ArrayList<String>) list.clone();for (int j = 0; j < board[i].length; j++) {Character c = board[i][j];if (!c.equals('.') && !removeList.remove(c)) {return false;}}}return true;}public static void main(String[] args) {char[][] 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'}};boolean validSudoku = isValidSudoku(board);System.out.println(validSudoku);}

下面分别是第一名和第二名写的算法:

    public boolean isValidSudoku(char[][] board) {int[][] signs = new int[3][9];for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {if (board[i][j] == '.')continue;int n = 1 << (board[i][j] - '1');int cubeIndex = i / 3 * 3 + j / 3;if ((signs[0][i] & n) != 0 || (signs[1][j] & n) != 0 || (signs[2][cubeIndex] & n) != 0)return false;signs[0][i] |= n;signs[1][j] |= n;signs[2][cubeIndex] |= n;}}return true;}
    public boolean isValidSudoku(char[][] board) {int len = board.length;boolean row[][] = new boolean[len][len];boolean col[][] = new boolean[len][len];boolean block[][] = new boolean[len][len];for (int i=0;i<len;i++){for (int j=0;j<len;j++){int c = board[i][j]-'1';if (c >= 0 && c <=8){if (row[i][c] || col[c][j] || block[3*(i/3)+j/3][c])return false;row[i][c] = true;col[c][j] = true;block[3*(i/3)+j/3][c] = true;}}}return true;}

这个题目我觉得核心的地方就是计算九宫格的下标了,我自己写的方式可能好理解一点。

LeetCode--初级算法--数组篇--第十题--有效的数独相关推荐

  1. LeetCode初级算法(数组)解答

    这里记录了LeetCode初级算法中数组的一些题目: 加一 本来想先转成整数,加1后再转回去:耽美想到测试的例子考虑到了这个方法的笨重,所以int类型超了最大范围65536,导致程序出错. class ...

  2. leetcode 初级算法 数组

    数组 从排序数组中删除重复项 买卖股票的最佳时机 旋转数组 存在重复 只出现一次的数字 两个数组的交集II 加1 移动0 两数之和 有效的数独 旋转图像 从排序数组中删除重复项 题目:传入一个int型 ...

  3. Leetcode初级算法(链表篇)

    删除链表的倒数第N个节点 感觉自己对于链表的知识还是了解的不够深入,所以没有想到用双指针进行操作.我的想法是这样的,首先计算整个链表的长度,然后遍历到长度减去n的节点处,执行删除操作. 自己的代码: ...

  4. 力扣:探索初级算法——数组篇——有效的数独

    题目:有效的数独 代码(C语言) bool isValidSudoku(char** board, int boardSize, int* boardColSize){int row[9][10] = ...

  5. [算法]力扣刷题-初级算法 - 数组(三)(数组篇完结) [两数之和] [有效的数独] [旋转图像]

    初级算法 - 数组篇完结: 初级算法 - 数组(一): https://blog.csdn.net/weixin_43854928/article/details/121315702 初级算法 - 数 ...

  6. leetcode初级算法4.两个数组的交集 II

    leetcode初级算法4.两个数组的交集 II 仅为个人刷题记录,不提供解题思路 题解与收获 我的解法:(总结在代码中) public int[] intersect(int[] nums1, in ...

  7. leetcode初级算法5.加一

    leetcode初级算法5.加一 仅为个人刷题记录,不提供解题思路 题解与收获 我的解法:(总结在代码中) public int[] plusOne(int[] digits) {//获取digits ...

  8. Leetcode 初级算法 - 设计问题

    Leetcode 初级算法 - 设计问题 原始地址:https://github.com/jerrylususu/leetcode-easy 二级标题格式:[章节内题号] [题库内题号] [题目标题] ...

  9. leetcode初级算法6.字符串转整数(atoi)

    leetcode初级算法6.字符串转整数(atoi) 仅为个人刷题记录,不提供解题思路 题解与收获 我的解法: public int myAtoi(String s) {//避免魔法值先设spaceS ...

最新文章

  1. CSS background 之设置图片为背景技巧
  2. java tomcat 时间不对解决办法
  3. 树莓派安装python3.5_树莓派 | 04 安装基于python3.5的tensorflow,解决python版本不匹配问题...
  4. Linux 循环与变量
  5. 精品软件试用及分享 屏幕录像专家注册版 附下载地址
  6. python画圆及其内接多边形_用Shapely求多边形的最大内接矩形
  7. 网站服务器域名费用入什么科目,企业域名服务费记什么科目
  8. wingFTP实现访问共享目录
  9. 论文阅读:基于多模态词向量的语句距离计算方法
  10. AI元宇宙数字人直播带货软件 全天24小时直播带货系统 含搭建教程
  11. 由于使用计算机编制会计报表,《计算机会计学》1
  12. 据说,年薪百万的程序员,都是这么开悟的
  13. Siam家族PySOT---github-siam跟踪算法包---商汤新发布的--手把手配置教学
  14. 动态链接库DLL创建及导出函数、调用DLL
  15. 基于SSM的演唱会网上订票系统
  16. c++ cleartype_在Windows Vista中调整ClearType字体设置
  17. docker配置daemon
  18. 人工智能中的rl是什么意思_AI学习如何使用第二部分来创建自定义RL环境并培训代理...
  19. c#点检系统后端.cs
  20. 取得网络中SQL的服务器列表

热门文章

  1. Thinkphp5结合layer导入excel
  2. 定积分的基本性质5 区间可加性
  3. 实现全站http到https的301转向(实测有用)
  4. python菜单怎么做_Python 城市菜单详解(超详解)
  5. Linux设备驱动之IIO子系统——IIO框架及IIO数据结构
  6. FEDORA9安装后的配置lvlv全记录必看一览表 解决FC9安装后网络需激活
  7. 区块链是什么通俗解释_区块链技术是什么?区块链的通俗解释原来是这样!
  8. 【焊接】 焊接技巧
  9. 全国计算机互联网城市排名,中国互联网+城市排名:杭州第一 北京仅排第八
  10. Android 自定义软键盘实现 数字九宫格