LeetCode36:有效的数独

LeetCode36:有效的数独

题目说明

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.

分析

相关的博客分析是定义了标志矩阵,记录每行每列的该位置是否出现了重复的元素,但执行起来发现效率并不高。提交后看到别人运行效率较高的做法,倒是很直接。直接先遍历每一行,每一列,然后在每个3x3的小方格内进行判断。
这里需要注意一点就是

for( int p = i+1; p < i/3*3+3; p++) {
                    for( int q = j+1; q < j/3*3+3; q++)
                        if( board[i][j] == board[p][q])
                            return false;

并不能将方格内的所有元素遍历,如下的两个就比较不到,所以再给它一个循环。
在这里插入图片描述
下面把参考代码贴上来

C++代码

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        if(board.empty() || board[0].empty()) return false;
        for(int i = 0; i < 9; i++) {
            for(int j = 0; j < 9; j++) {
                if( board[i][j] == '.')
                    continue;
                //行进行判断
                for( int p = j+1; p < 9; p++) {
                    if( board[i][j] == board[i][p]) 
                        return false;
                }
                //列进行判断
                for( int q = i+1; q < 9; q++) {
                    if( board[i][j] == board[q][j])
                        return false;
                }
                for( int p = i+1; p < i/3*3+3; p++) {
                    for( int q = j+1; q < j/3*3+3; q++)
                        if( board[i][j] == board[p][q])
                            return false;
                    for( int q = j/3*3; q < j; q++) 
                        if( board[i][j] == board[p][q])
                            return false;
                }                                                                                                
            }
        }
        return true;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值