每日一题_36. 有效的数独

每日一题_36. 有效的数独

leetcode_36

题目:
在这里插入图片描述
题意分析:
这一题是一个常规题吧,就是让我们判断一个数独题目是不是正确的,但是注意这不是让我们判断数独本省有没有解,只是让我们判断这个数独题目本身满不满足数独的条件。

这道题没什么太多的算法,就是有两个技巧吧,一个是记录每行每列九宫格里字符出现的个数,因为范围固定在字符1-9,因此可以用一个int数组来当作hash表,键值就是ch(char) - ‘0’。

另一个处理的就是遍历九宫格了,官方答案给的是一次遍历,但是我一开始想的就是分开遍历,在遍历九宫格,有思考一会儿。官答是直接开了一个三维数组([3][3][9])来记录每行每列的九宫格,我思维比较直接就用一个一维数组,单独遍历每个九宫格进行检验,遍历的时候找到每个小九宫的起点,也就是(0,0),(0,3),(0,6)… … 找到起点之后,每个九宫格有九个数,遍历然后在起点的基础上加上偏移就行了(k / 3, k % 3)。

代码:

class Solution {
public:

    bool isValidSudoku(vector<vector<char>>& board) {
        int a[10];
        for (int i = 0; i < 9; i ++)
        {
            memset(a, 0, sizeof a);
            for (int j = 0; j < 9; j ++)
                if ((board[i][j] != '.') && ++ a[board[i][j] - '0'] > 1) return false;
        }

        for (int i = 0; i < 9; i ++)
        {
            memset(a, 0, sizeof a);
            for (int j = 0; j < 9; j ++)
                if ((board[j][i] != '.') && (++ a[board[j][i] - '0'] > 1)) return false;
        }

        for (int i = 0; i < 9; i += 3)
            for (int j = 0; j < 9; j += 3)
            {
                memset(a, 0, sizeof a);
                for (int k = 0; k < 9; k ++)
                {
                    int row = i + k / 3, col = j + k % 3;
                    if (board[row][col] != '.' && ++ a[board[row][col] - '0'] > 1) return false;
                }
            }

        return true;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值