leetcode刷题日记——有效的数独

[ 题目描述 ]:
leetcode刷题日记——有效的数独_第1张图片
[ 思路 ]:

  • 题目要求求一个数独题目是否有效,即每行,每列,每个九宫格都不能出现相同的数字
  • 暴力求解:对每行,每列,以及九宫格进行检查是否存在相同数字
  • 运行如下
    leetcode刷题日记——有效的数独_第2张图片
bool isValidSudoku(char** board, int boardSize, int* boardColSize) {
    int row,column,number;
    for(int i=0;i<9;i++){
        int nums[9]={0};
        for(int j=0;j<9;j++){
            if(board[i][j]=='.') continue;
            nums[board[i][j]-'1']++;
            if(nums[board[i][j]-'1']>1) return false;
        }
    }
    for(int i=0;i<9;i++){
        int nums[9]={0};
        for(int j=0;j<9;j++){
            if(board[j][i]=='.') continue;
            nums[board[j][i]-'1']++;
            if(nums[board[j][i]-'1']>1) return false;
        }
    }
    for(int block=0;block<9;block++){
        int nums[9]={0};
        int rowStart= (block/3)*3;
        int colStart= (block%3)*3;
        for (int i=0;i<3;i++) {
            for (int j=0; j<3; j++) {
                char c=board[rowStart+i][colStart+j];
                if(c=='.') continue;
                if(nums[c-'1']++) return false;
            }
        }
    }
    return true;
}

[ 官方题解 ]:

  • 一、一次遍历,使用哈希表记录每一行、每一列和每一个小九宫格中,每个数字出现的次数。只需要遍历数独一次,在遍历的过程中更新哈希表中的计数,并判断是否满足有效的数独的条件即可。

[ 评论区大佬题解 ]: 通过位运算记九个数字的出现情况,缩减了空间

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        rows = [0]*9
        cols = [0]*9
        block = [0]*9
        for i in range(9):
            for j in range(9):
                if board[i][j] != '.':
                    x = int(board[i][j])
                    if rows[i]>>x&1 or cols[j]>>x&1 or block[(i//3)*3+j//3]>>x&1:
                        return False
                    rows[i] |= 1<

你可能感兴趣的:(刷题日记,面试经典150题,leetcode,算法,职场和发展)