LEETCODE 36. Valid Sudoku

本文介绍了一种高效的数独有效性验证算法。通过使用三个布尔数组分别记录每行、每列及每个子区域内的数字出现情况,该算法仅需遍历整个数独盘面一次即可完成验证,大大提高了效率。

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

题目大意

给出一个9*9的二维表格:
这里写图片描述
判断这个表格是不是有效的数独表格。

解题思路

一种解法:
用一个9维数组,存放每个数字是不是出现过,按列、行、小格遍历
另一种解法:
分别用三个数组,第一个数组放着某个数字在某一列是否出现过;第二个数组放着某个数字在某一行是否出现过;第三个数组放着某个数字在某一小格是否出现过。
第二种解法需要遍历表格一次而已,而第一种解法则需要遍历表格两次。实现第二种解法。

代码

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        bool checkCol[9][9] = {false}, checkRow[9][9] = {false}, checkBlock[9][9] = {false;
        for (int i = 0; i < board.size(); i++) {
            for (int j = 0; j < board[i].size(); j++) {
                if (board[i][j] != '.') {
                    if (checkCol[i][board[i][j] - '1'] || checkRow[j][board[i][j] - '1'] || checkBlock[i / 3 * 3 + j / 3][board[i][j] - '1']) {
                        return false;
                    }
                    checkCol[i][board[i][j] - '1'] = true;
                    checkRow[j][board[i][j] - '1'] = true;
                    checkBlock[i / 3 * 3 + j / 3][board[i][j] - '1'] = true;
                }
            }
        }
        return true;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值