【刷题记录】36. 有效的数独

简介: 【刷题记录】36. 有效的数独

一、题目描述


来源:力扣(LeetCode)


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


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


注意:


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


示例 1:


网络异常,图片无法展示
|


输入: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"]]

输出:true


示例 2:


输入:board =

[["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 存在, 因此这个数独是无效的。


提示:


  • board.length == 9
  • board[i].length == 9
  • board[i][j] 是一位数字(1-9)或者 '.'


二丶思路分析


数组


这道题目是判断数独的有效性
所以我们可以定义三个二维数组


  • rows 记录每行数字出现的情况
  • colnum 记录每列数字出现的情况
  • area 记录每个方块数字出现的情况
  • 我们可以推出 方块编号和行列的关系为 idx = i / 3 * 3 + j / 3
  • 遍历 board,如果违反数独的规则,则返回 false,结束都没违反则返回true


三、代码实现

class Solution {
    public boolean isValidSudoku(char[][] board) {
        //记录每行,列 ,每个方块出现数字的情况
        boolean[][] row = new boolean[9][9];
        boolean[][] colnum = new boolean[9][9];
        boolean[][] area = new boolean[9][9];
for (int i =0; i < 9; i++) {
for (int j =0; j < 9; j++) {
if (board[i][j] =='.') continue;
                int c = board[i][j] -'1';
                int idx = i / 3 * 3+ j / 3;
if (!row[i][c] && !colnum[j][c] && !area[idx][c]) {
                    //标记为出现过
                    row[i][c] = colnum[j][c] = area[idx][c] =true;
                } else {
                    return false;
                }
            }
        }
        return true;
    }
}


复杂度分析


  • 时间复杂度:
    网络异常,图片无法展示
    |
  • 空间复杂度:
    网络异常,图片无法展示
    |


运行结果


网络异常,图片无法展示
|


总结


这道题目就是一道按照 数独的规则 进行模拟的题目,然后遍历,看是否完全满足。


其中还有一个就是找出每个方块编号和行列的对于关系,或者直接用一个三维数组来代替 也行。


继续加油~~

目录
相关文章
|
7月前
|
人工智能 BI
【每日一题】1. 牛客网——合并两个有序数组
【每日一题】1. 牛客网——合并两个有序数组
|
7月前
|
算法
六六力扣刷题数组之再刷二分法
六六力扣刷题数组之再刷二分法
46 0
《蓝桥杯每日一题》双指针·AcWing 3768. 字符串删减
《蓝桥杯每日一题》双指针·AcWing 3768. 字符串删减
63 0
C/C++ leetcode刷题的各种小tips记录
C/C++ leetcode刷题的各种小tips记录
145 0
|
监控 算法
牛客刷题记录(常见笔试题)(下)
牛客刷题记录(常见笔试题)(下)
128 0
牛客刷题记录(常见笔试题)(上)
牛客刷题记录(常见笔试题)(上)
111 0
|
存储 算法 Java
代码随想录刷题|LeetCode 332.重新安排行程 51. N皇后 37. 解数独
代码随想录刷题|LeetCode 332.重新安排行程 51. N皇后 37. 解数独
代码随想录刷题|LeetCode 332.重新安排行程 51. N皇后 37. 解数独
|
算法 Java
【牛客刷题】每日一练——删除有序数组中的重复项
【牛客刷题】每日一练——删除有序数组中的重复项
121 0
【刷题记录】46. 全排列
【刷题记录】46. 全排列
125 0
【刷题记录】46. 全排列