程序员

力扣 36 有效的数独

2020-07-23  本文已影响0人  zhaojinhui

题意:给定一个数独的棋盘,判断其是否合法

思路:搜索遍历每一种可能结果,具体解析见代码注释

思想:数组遍历

复杂度:时间O(n2),空间O(1)

class Solution {
    public boolean isValidSudoku(char[][] board) {
        int m = board.length;
        if(m == 0)
            return false;
        int n = board[0].length;
        
        for(int i=0;i<m;i++) {
            for(int j=0;j<n;j++) {
                // 查看每一个数字元素看是否合法
                if(board[i][j] != '.' && invalid(i, j, board)) {
                    return false;
                }
            } 
        }
        return true;
    }
    
    boolean invalid(int i, int j, char[][] board) {
        int m = board.length;
        int n = board[0].length;
        char cur = board[i][j];
        for(int z=0;z<m;z++) {
            // 查每一行是否合法
            if(z != j && board[i][z] == cur) 
                return true;
            // 查每一列是否合法
            if(z != i && board[z][j] == cur)
                return true;
            // 查每一个3元格是否合法
            int curi = i/3 * 3 + z%3;
            int curj = j/3 * 3 + z/3;
            if(curi != i && curj != j && board[curi][curj] == cur)
                return true;
        }
        return false;
    }
}
上一篇下一篇

猜你喜欢

热点阅读