力扣_数组11—判断是否为有效的数独

文章介绍了使用哈希表和数组数据结构来验证数独的有效性的方法,通过检查行、列和小九宫格中数字出现的唯一性,确保数独遵循规则。作者提供了C++代码实现的Solution类中的isValidSudoku函数。

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

题目

  • 有效数独
    • 1 − 9 1-9 19 在每行只出现一次
    • 1 − 9 1-9 19 在每列只出现一次
    • 1 − 9 1-9 19 在每个小九宫格只出现一次( 9 × 9 9×9 9×9 的 棋盘分成 3 × 3 3×3 3×3 3 × 3 3×3 3×3 的小九宫格)

思路

  • 哈希表
    • 创建三个二维数组 r o w s [ 9 ] [ 9 ] , c o l s [ 9 ] [ 9 ] , s u b b o x e s [ 9 ] [ 9 ] rows[9][9], cols[9][9], subboxes[9][9] rows[9][9],cols[9][9],subboxes[9][9]
    • r o w s [ i ] [ n u m ] rows[i][num] rows[i][num] 用来存放第 i i i n u m num num 出现的次数,其他两个同理
    • 有值大于 1 1 1 则返回 f a l s e false false
  • 改进(数位哈希)
    • 创建三个一维数组 r o w s [ 9 ] , c o l s [ 9 ] , s u b b o x e s [ 9 ] rows[9], cols[9], subboxes[9] rows[9],cols[9],subboxes[9]
    • 若第 i i i 行第某个数是 5 5 5,则 r o w s [ i ] = r o w s [ i ] ∣ ( 10000 ) rows[i] = rows[i] | (10000) rows[i]=rows[i](10000) (即第 5 5 5 位是 1 1 1,其余位是 0 0 0
    • 设第 i i i 行某列的数 n u m num num 对应的二进制为 B B B,若 r o w s [ i ] 与 B > 0 rows[i] 与 B > 0 rows[i]B>0,则表示 n u m num num 已经在第 i i i 行出现过,返回 f a l s e false false

代码

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        // int rows[9][9] = {0};
        // int cols[9][9] = {0};
        // int subboxes[9][9] = {0};
        // for(int i = 0; i < 9; i++){
        //     for(int j = 0; j < 9; j++){
        //         if(board[i][j] == '.')
        //             continue;
        //         rows[i][board[i][j]-'0'-1]++;
        //         cols[j][board[i][j]-'0'-1]++;
        //         subboxes[int(i/3)*3+j/3][board[i][j]-'0'-1]++;
        //         if(rows[i][board[i][j]-'0'-1]>1 || cols[j][board[i][j]-'0'-1]>1 ||subboxes[int(i/3)*3+j/3][board[i][j]-'0'-1]>1){
        //             return false;
        //         }   
        //     }
        // }
        // return true;

        //
        int rows[9] = {0};
        int cols[9] = {0};
        int subboxes[3][3] = {0};
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (board[i][j] != '.') {
                    int x = 1 << (board[i][j] - '1');
                    if (rows[i] & x || cols[j] & x || subboxes[i / 3][j / 3] & x)
                        return false;
                    rows[i] |= x; 
                    cols[j] |= x; 
                    subboxes[i / 3][j / 3] |= x;
                }
            }
        }
        return true;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值