Leetcode 36. 有效的数独

偶尔善良 提交于 2020-03-03 05:23:33

判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

简单的三次遍历:

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        if(board.size()<=0) {
            return false;
        }
        unordered_map<char,int> check;
        // 检查每一行
        for (int i = 0; i < board.size(); i++)
        {
            for (int j = 0; j < board[0].size(); j++)
            {
                if(board[i][j]!='.') {
                    auto iter=check.find(board[i][j]);
                    if(iter==check.end()) {
                        check[board[i][j]]=1;
                    } else {
                        return false;
                    }
                }
            }
            check.clear();
        }

        // 检查每一列
        for (int i = 0; i < board[0].size(); i++)
        {
            for (int j = 0; j < board.size(); j++)
            {
                if(board[j][i]!='.') {
                    auto iter=check.find(board[j][i]);
                    if(iter==check.end()) {
                        check[board[j][i]]=1;
                    } else {
                        return false;
                    }
                }
            }
            check.clear();
        }

        // 检查每个小正方形
        for (int i = 0; i < board[0].size()/3; i++)
        {
            for (int j = 0; j < board.size()/3; j++)
            {
                
                for (int k = 0; k < 3; k++)
                {
                    for (int m = 0; m < 3; m++)
                    {
                        if(board[i*3+k][j*3+m]!='.') {
                            auto iter=check.find(board[i*3+k][j*3+m]);
                            if(iter==check.end()) {
                                check[board[i*3+k][j*3+m]]=1;
                            } else {
                                return false;
                            }
                        }
                    }
                }
                check.clear();
            }
            
        }
        return true;
    }
};

优化为只需一次遍历:

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        if(board.size()<=0) {
            return false;
        }
        vector<vector<bool>> rows(9,vector<bool>(9,false));
        vector<vector<bool>> cols(9,vector<bool>(9,false));
        vector<vector<bool>> subBox(9,vector<bool>(9,false));

        for (int i = 0; i < board.size(); i++)
        {
            for (int j = 0; j < board[0].size(); j++)
            {
                
                if(board[i][j]!='.') {
                    int num = board[i][j]-'1';
                    if(rows[i][num]) {
                        return false;
                    } else {
                        rows[i][num] = true;
                    }
                    if(cols[j][num]) {
                        return false;
                    } else {
                        cols[j][num] = true;
                    }
                    if(subBox[i/3+(j/3)*3][num]) {
                        return false;
                    } else {
                        subBox[i/3+(j/3)*3][num]=true;
                    }
                }
            }
        }
        return true;
    }
};
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!