leetcode刷题(数组)14—有效的数独

36. 有效的数独

判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
在这里插入图片描述

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

class Solution {
    
    
    public boolean isValidSudoku(char[][] board) {
    
    
        //执行用时:2 ms, 在所有 Java 提交中击败了96.52%的用户
        //内存消耗:39.4 MB, 在所有 Java 提交中击败了94.88%的用户
        int[] m = new int[10];
        int n = board.length;
        //每行只出现一次
        int num;
        for(int i = 0;i < n;++i){
    
    
             //赋初始值
            for(int k = 0;k < 10;++k){
    
    
                m[k] = 0;
            }
            for(int j = 0;j < n;++j){
    
    
                if (Character.isDigit(board[i][j])){
    
      // 判断是否是数字
                    num = (int)board[i][j] - (int)('0');
                    //System.out.println(num);
                    if(m[num] == 0)
                        m[num] = 1;
                    else
                        return false;
                }
                
            }
        }
        //每列只出现一次
        for(int j = 0;j < n;++j){
    
    
             //赋初始值
            for(int k = 0;k < 10;++k){
    
    
                 m[k] = 0;
            }
            for(int i = 0;i < n;++i){
    
    
                if (Character.isDigit(board[i][j])){
    
      // 判断是否是数字
                    num = (int)board[i][j] - (int)('0');
                    //System.out.println(num);
                    if(m[num] == 0)
                        m[num] = 1;
                    else
                        return false;
                }
                
            }
        }
        //每一个以粗实线分隔的 3x3 宫内只能出现一次。
        for(int i = 0;i < 7;i += 3){
    
    
            for(int j = 0;j < 7; j += 3){
    
    
                 //赋初始值
                for(int k = 0;k < 10;++k){
    
    
                    m[k] = 0;
                }
                for(int p = 0; p < 3;++p){
    
    
                    for(int q = 0; q < 3;++q){
    
    
                        if (Character.isDigit(board[i + p][j + q])){
    
      // 判断是否是数字
                            num = (int)board[i + p][j + q] - (int)('0');
                            //System.out.println(num);
                            if(m[num] == 0)
                                m[num] = 1;
                            else
                                return false;
                        }
                        
                    }
                }
            }
        }
        return true;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38754625/article/details/108421359