LeetCode刷题---有效的数独

2024-01-02 19:02:14

在这里插入图片描述
在这里插入图片描述
解题思路:

该题通过哈希表(数组)计数来解决,因为矩阵是一个9*9的固定矩阵
定义二维数组rows,columns和三维度数组subboxes来对矩阵中第i行第j列数字在行、列和九宫格中出现的次数计数。
如果是一个有效的数独,那么矩阵中某个格子中的数字出现的次数在以上数组中对应的位置应该为1,如果超过1,则证明这个矩阵不是一个有效的数独。
行:rows[i][index]中i表示这是第几行,index即矩阵中第i行第j列单元格中数字-1(因为1<=数<=9,而索引0<=index<=8),index也是这个数在rows数组中第i行的索引,即rows[i][index]它表示矩阵中第i行第j列数字在第i行出现的次数。
列:columns[j][index]中j表示这是第几列,index即矩阵中第i行第j列单元格中数字-1,index也是这个数在columns数组中第j列的索引,即columns[j][index]它表示矩阵中第i行第j列数字在第j列出现的次数。
九宫格:subboxes[i / 3][j / 3][index]通过i/3和j/3来确定矩阵中某个九宫格的位置,index表示矩阵中第i行第j列的数-1,index也是这个数在subboxes数组中第n个九宫格中的索引,即subboxes[i / 3][j / 3][index]表示这个数在矩阵中第个九宫格出现的次数。
举例:如果矩阵中第1行第1列的数字为5,它的次数在rows数组中的位置为rows[1][4],即rows数组的第1行第4列。

代码实现:

		//行计数
		int[][] rows = new int[9][9];
		//列计数
        int[][] columns = new int[9][9];
        //九宫格计数
        int[][][] subboxes = new int[3][3][9];
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                char c = board[i][j];
                if (c != '.') {
                    int index = c - '0' - 1;
                    //计数
                    rows[i][index]++;
                    columns[j][index]++;
                    subboxes[i / 3][j / 3][index]++;
                    //判断是不是有效的数独
                    if (rows[i][index] > 1 || columns[j][index] > 1 || subboxes[i / 3][j / 3][index] > 1) {
                        return false;
                    }
                }
            }
        }
        return true;
    }

文章来源:https://blog.csdn.net/weixin_47109902/article/details/135333252
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。