有效的数独

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

数字 1-9 在每一行只能出现一次。

数字 1-9 在每一列只能出现一次。

数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

数独部分空格内已填入了数字,空白格用 '.' 表示。

注意:

  • 一个有效的数独(部分已被填充)不一定是可解的。
  • 只需要根据以上规则,验证已经填入的数字是否有效即可。

示例说明请见LeetCode官网。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/valid-sudoku/

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:数组遍历

分为3种情况判断,分别是行判断、列判断、3*3宫内判断,判断逻辑是利用Set判重,如果在同一行(或同一列、同一宫内)有重复的数字,则返回false;如果都符合,最后返回true。

  1. import javafx.util.Pair;
  2. import java.util.ArrayList;
  3. import java.util.HashSet;
  4. import java.util.List;
  5. import java.util.Set;
  6. public class LeetCode_036 {
  7. public static List<Pair<Integer, Integer>> all = new ArrayList<>();
  8. static {
  9. all.add(new Pair<>(0, 0));
  10. all.add(new Pair<>(0, 3));
  11. all.add(new Pair<>(0, 6));
  12. all.add(new Pair<>(3, 0));
  13. all.add(new Pair<>(3, 3));
  14. all.add(new Pair<>(3, 6));
  15. all.add(new Pair<>(6, 0));
  16. all.add(new Pair<>(6, 3));
  17. all.add(new Pair<>(6, 6));
  18. }
  19. public static boolean isValidSudoku(char[][] board) {
  20. // 行判断
  21. for (int i = 0; i < board.length; i++) {
  22. Set<Character> nums = new HashSet<>();
  23. for (int j = 0; j < board[i].length; j++) {
  24. if (board[i][j] != '.' && !nums.add(board[i][j])) {
  25. return false;
  26. }
  27. }
  28. }
  29. // 列判断
  30. for (int i = 0; i < board.length; i++) {
  31. Set<Character> nums = new HashSet<>();
  32. for (int j = 0; j < board.length; j++) {
  33. if (board[j][i] != '.' && !nums.add(board[j][i])) {
  34. return false;
  35. }
  36. }
  37. }
  38. // 宫内判断
  39. for (Pair<Integer, Integer> integerIntegerPair : all) {
  40. Set<Character> nums = new HashSet<>();
  41. for (int x = integerIntegerPair.getKey(); x < integerIntegerPair.getKey() + 3; x++) {
  42. for (int y = integerIntegerPair.getValue(); y < integerIntegerPair.getValue() + 3; y++) {
  43. if (board[x][y] != '.' && !nums.add(board[x][y])) {
  44. return false;
  45. }
  46. }
  47. }
  48. }
  49. return true;
  50. }
  51. public static void main(String[] args) {
  52. char[][] board = new char[][]{{'5', '3', '.', '.', '7', '.', '.', '.', '.'}
  53. , {'6', '.', '.', '1', '9', '5', '.', '.', '.'}
  54. , {'.', '9', '8', '.', '.', '.', '.', '6', '.'}
  55. , {'8', '.', '.', '.', '6', '.', '.', '.', '3'}
  56. , {'4', '.', '.', '8', '.', '3', '.', '.', '1'}
  57. , {'7', '.', '.', '.', '2', '.', '.', '.', '6'}
  58. , {'.', '6', '.', '.', '.', '.', '2', '8', '.'}
  59. , {'.', '.', '.', '4', '1', '9', '.', '.', '5'}
  60. , {'.', '.', '.', '.', '8', '.', '.', '7', '9'}};
  61. System.out.println(isValidSudoku(board));
  62. }
  63. }

【每日寄语】 希望生活给予你风浪的同时,也给你阳光作为回报,让你感受到这个世界的温柔。

LeetCode-036-有效的数独的更多相关文章

  1. [LeetCode] 036. Valid Sudoku (Easy) (C++)

    指数:[LeetCode] Leetcode 解决问题的指数 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 036. ...

  2. 前端与算法 leetcode 36. 有效的数独

    目录 # 前端与算法 leetcode 36. 有效的数独 题目描述 概要 提示 解析 算法 传入[['5', '3', '.', '.', '7', '.', '.', '.', '.'],['6' ...

  3. [LeetCode] Sudoku Solver 求解数独

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  4. [LeetCode] Valid Sudoku 验证数独

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

  5. Java实现 LeetCode 36 有效的数独

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

  6. leetcode 36 有效的数独 哈希表 unordered_set unordersd_map 保存状态 leetcode 37 解数独

    leetcode 36 感觉就是遍历. 保存好状态,就是各行各列还有各分区divide的情况 用数组做. 空间小时间大 class Solution { public: bool isValidSud ...

  7. Java for LeetCode 036 Valid Sudoku

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

  8. [Leetcode] valid sudoku 有效数独

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

  9. LeetCode 36——有效的数独

    1. 题目 2. 解答 将数独中数字的 ASCII 码值转化到 0-8 之间作为散列值,建立一个散列表,然后分别逐行.逐列.逐宫(3*3小块)统计每个数字的出现次数,若出现次数大于 1,则数独无效. ...

  10. [LeetCode] Sudoku Solver 解数独,递归,回溯

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

随机推荐

  1. TensorFlow 机器学习秘籍中文第二版·翻译完成

    原文:TensorFlow Machine Learning Cookbook 协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原则>,生活原则 2.3 ...

  2. Vue小白练级之路---001表单验证功能的一般实现思路

    思路: 先各自验证 非空校验 具体规则校验 后兜底校验( 防止用户没输入信息直接登录 ) 实现:( 以 element-ui 为例 ) 在 标签上用 model 动态绑定收集数据的对象(form) 在 ...

  3. docker平时使用异常记录

    GPU主机重启后,启动使用GPU的容器报错 docker: Error response from daemon: Unknown runtime specified nvidia. 解决办法:修改/ ...

  4. Solution -「多校联训」最大面积

    \(\mathcal{Description}\)   Link.   平面上有 \(n\) 个点 \(A_{1..n}\),\(q\) 次询问,每次给出点 \(P\),求 \[\max_{1\le ...

  5. Solution -「AGC 034C」Tests

    \(\mathcal{Description}\)   Link.   给定非负整数序列 \(\{l_n\},\{r_n\},\{b_n\},X\),求最小的 \(s\),使得存在非负整数序列 \(\ ...

  6. Solution -「CF 1361E」James and the Chase

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个点 \(m\) 条边的有向弱连通图.称一个点是"好点"当且仅当从该点出发,不存在到同一点 ...

  7. 自学linux(常用命令)STEP3

    tty tty 可以查看当前处于哪一个系统中. 比如我在图形化界面输入 tty: alt+ctrl+F3切换到命令行: linux命令 linux命令,一般都是 命令+选项+参数,这种格式,为了防止选 ...

  8. 日行一算(Vowel-大小写转换)

    题目 题目描述 solo从小就对英文字母非常感兴趣,尤其是元音字母(a,e,i,o,u,A,E,I,O,U),他在写日记的时候都会把元音字母写成大写的,辅音字母则都写成小写,虽然别人看起来很别扭,但是 ...

  9. JVM学习——类加载机制(学习过程)

    JVM--类加载机制 2020年02月07日14:49:19-开始学习JVM(Class Loader) 类加载机制 类加载器深入解析与阶段分解 在Java代码中,类型的加载.连接与初始化过程中都是在 ...

  10. spring的事务是如何回滚的、事务传播?

    实际上也是问的这个问题  spring的事务管理是如何实现的?总: spring的事务是由aop来实现的,首先要生成具体的代理对象,然后按照aop的整套流程来执行具体的操作逻辑,正常情况下要通过通知来 ...