Under my umbrella.

SKII

Less is more.

力扣题解 36th 有效的数独

36th 有效的数独

  • 哈希表思想与二维数组区块(section)的划分

    首先,采用哈希表思想保证数字1-9只出现一次。

    其次,对于条件1和条件2我们很容易写出对应的hash table并填充好数据,但是对于条件3我们需要将二位数组进行区块拆封。

    区块拆封方法:

    • 分析过程:已知原数组容量为9x9,则以一个3x3为区块拆分后,二维数组容量为为3x3。当i=0或1或2,j=0或1或2时,i/3始终为0,j/3始终为0。以此类推可用i/3,j/3来定位新的3x3数组。
    class Solution {
        public boolean isValidSudoku(char[][] board) {
            int[][] table_raw = new int[9][10];
            int[][] table_column = new int[9][10];
            int[][][] table_section = new int[3][3][10];
    
            for (int i = 0; i < 9; i++) {
                for (int j = 0; j < 9; j++) {
                    // raw
                    if (board[i][j] != '.')
                        table_raw[i][board[i][j] - '0']++;
                    // column
                    if (board[j][i] != '.')
                        table_column[i][board[j][i] - '0']++;
                    // section
                    if (board[i][j] != '.')
                        table_section[i / 3][j / 3][board[i][j] - '0']++;
                }
            }
    
            for (int i = 0; i < 9; i++) {
                for (int j = 0; j < 10; j++) {
                    if (table_raw[i][j] > 1 || table_column[i][j] > 1)
                        return false;
                }
            }
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    for (int k = 0; k < 10; k++) {
                        if (table_section[i][j][k] > 1)
                            return false;
                    }
                }
            }
            return true;
        }
    }
    
posted @ 2020-07-04 16:50  NLYang  阅读(151)  评论(0编辑  收藏  举报