Valid Sudoku

之前思考想要1次遍历即完成,但是想到27个set,最后采用3次遍历(通过map)完成判断,时间复杂度过高。

记录他人的解法(采用set):

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        set<string> r_set,c_set,g_set;
        for(int i=0;i<9;++i){
            for(int j=0;j<9;++j){
                char ch = board[i][j];
                if(ch!='.'){
                    int grid = ((i/3)*3+j/3);
                    string r_str = "r"+to_string(i)+string(ch,1);
                    string c_str = "c"+to_string(j)+string(ch,1);
                    string g_str = "g"+to_string(grid)+string(ch,1);
                    if(r_set.find(r_str)!=r_set.end()||c_set.find(c_str)!=c_set.end()||g_set.find(g_str)!=g_set.end())
                        return false;
                    r_set.insert(r_str);
                    c_set.insert(c_str);
                    g_set.insert(g_str);
                }
            }
        }
        return true;
    }
};


最后贴上自己的代码(实在是又长又烂):

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        bool ans = judgerow(board)&&judgecol(board)&&judgebox(board);
        return ans;
    }
private:
    map<char,int> maptest;
    bool judgerow(vector<vector<char>>& board){
        for(int i=0;i<9;++i){
            maptest.clear();
            for(int j=0;j<9;++j){
                if(board[i][j]=='.')
                    continue;
                map<char,int>::iterator iter;
                iter = maptest.find(board[i][j]);
                if(iter==maptest.end()){
                    maptest.insert(map<char,int>::value_type(board[i][j],1));
                }
                else{
                    return false;
                }
            }
        }
        return true;
    }
    bool judgecol(vector<vector<char>>& board){
        for(int i=0;i<9;++i){
            maptest.clear();
            for(int j=0;j<9;++j){
                if(board[j][i]=='.')
                    continue;
                map<char,int>::iterator iter;
                iter = maptest.find(board[j][i]);
                if(iter==maptest.end()){
                    maptest.insert(map<char,int>::value_type(board[j][i],1));
                }
                else
                    return false;
            }
        }
        return true;
    }
    bool judgebox(vector<vector<char>>& board){
        for(int i=0;i<3;++i){
            for(int j=0;j<3;++j){
                maptest.clear();
                for(int p=i*3;p<(i+1)*3;++p){
                    for(int q=j*3;q<(j+1)*3;++q){
                        if(board[p][q]=='.')
                            continue;
                        map<char,int>::iterator iter;
                        iter = maptest.find(board[p][q]);
                        if(iter==maptest.end()){
                            maptest.insert(map<char,int>::value_type(board[p][q],1));
                        }
                        else
                            return false;
                    }
                }
            }
        }
        return true;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值