leetcode36题 题解 翻译 C语言版 Python版

本文介绍了一种用于快速判断数独是否有效的算法,包括行、列和九宫格的重复数字检查,确保每个数字从1到9恰好出现一次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

36. Valid Sudoku

Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.

The Sudoku board could be partially filled, where empty cells are filled with the character '.'.


A partially filled sudoku which is valid.

Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.

36.有效数独

判断一个数独是不是有效的。参考:数独规则

数独的边界能被部分填充,空的地方填充字符'.'。

如图是一个部分填充的数独并且是有效的。

注意:

一个有效的数独不一定有解。只需要验证填充的地方就行了。


思路:按规则来逐行逐列逐九宫格判断是不是有重复数字就行了。每次判断时新建一个数组,每找到一个数先判断数组中是否有这个数,有的话就无效,没有就填进去。因为数是0-9的,所以可以建一个长度为10的数组采用计数的方式让数字对应下标,也可以图省事用ascii码对应数组下标。


bool isValidSudoku(char** board, int boardRowSize, int boardColSize) {
    for (int i = 0; i < boardRowSize; i++){
        bool t[128] = {false};
        for (int j = 0; j < boardColSize; j++){
            if (board[i][j] == '.') continue;
            if (t[board[i][j]]) return false;
            else t[board[i][j]] = true;
        }
    }
    for (int j = 0; j < boardColSize; j++){
        bool t[128] = {false};
        for (int i = 0; i < boardRowSize; i++){
            if (board[i][j] == '.') continue;
            if (t[board[i][j]]) return false;
            else t[board[i][j]] = true;
        }
    }
    for (int i = 0; i < 3; i++){
        for (int j = 0; j < 3; j++){
            bool t[128] = {false};
            for (int m = 0; m < boardRowSize / 3; m++){
                for (int n = 0; n < boardColSize / 3; n++){
                    if (board[i*3+m][j*3+n] == '.') continue;
                    if (t[board[i*3+m][j*3+n]]) return false;
                    else  t[board[i*3+m][j*3+n]] = true;
                }
            }
        }
    }
    return true;
}


class Solution(object):
    def isValidSudoku(self, board):
        """
        :type board: List[List[str]]
        :rtype: bool
        """
        for line in board:
            for i, cell in enumerate(line):
                if cell != '.' and cell in line[:i]:
                    return False
        board2 = zip(*board)
        for column in board2:
            for i, cell in enumerate(column):
                if cell != '.' and cell in column[:i]:
                    return False
        for i in range(3):
            for j in range(3):
                num = []
                for m in range(3):
                    for n in range(3):
                        cell = board[i*3+m][j*3+n]
                        if cell != '.':
                            if cell in num:
                                return False
                            else: num.append(cell)
        return True


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值