36. 有效的数独(C++)

该文章介绍了如何使用C++中的哈希表解决LeetCode上的ValidSudoku问题,通过遍历矩阵来检查行、列及九宫格是否有重复数字,从而判断数独是否有效。作者强调了初始化哈希表的重要性以及作用域对代码正确性的影响。
摘要由CSDN通过智能技术生成

题干:
https://leetcode.cn/problems/valid-sudoku/

检验重复性,自然想到了哈希表…,

我的参考代码如下:

//这次代码由于hashSet对象的作用域问题,导致我调试了很长时间。
//希望以后自己在定义C++的库中类对象时,也不要忘记了初始化,初始化会提醒自己作用域的设定,避免错误。

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
		//这里应该添加数组值的合法性检验,以及数组大小检验,我省略了
		
        for (int i = 0; i < board.size(); i++) {
            unordered_set<char> hashSet{};
            for (int j = 0; j < board.size(); j++) { //判断每一行是否符合要求
                if (board[i][j] != '.') {
                    if (hashSet.find(board[i][j]) == hashSet.end()) {
                        hashSet.insert(board[i][j]);
                    }
                    else { return false; }
                }
            }
            hashSet.clear();
        }

        for (int j = 0; j < board.size(); j++) {
            unordered_set<char> hashSet{};
            for (int i = 0; i < board.size(); i++) {    //判断每一列是否符合要求
                if (board[i][j] != '.') {
                    if (hashSet.find(board[i][j]) == hashSet.end()) {
                        hashSet.insert(board[i][j]);
                    }
                    else { return false; }
                }  
            }
            hashSet.clear();
        }

        //告诫自己,由于hashSet1,2,3的作用域写到了第一个for里面,导致自己调试了很久发现不了错误!
        //我是按一行一行读取的
        unordered_set<char> hashSet1{};//第一个九宫格
        unordered_set<char> hashSet2{};//第二个
        unordered_set<char> hashSet3{};//第三个
        for (int i = 0; i < board.size(); i++) {
            for (int j = 0; j < board.size(); j++) {    //判断每一九宫格是否符合要求
                if (j / 3 == 0) {
                    if (board[i][j] != '.') {
                        if (hashSet1.find(board[i][j]) == hashSet1.end()) {
                            hashSet1.insert(board[i][j]);
                        }
                        else { return false; }
                    }      
                }
                else if (j / 3 == 1) {
                    if (board[i][j] != '.') {
                        if (hashSet2.find(board[i][j]) == hashSet2.end()) {
                            hashSet2.insert(board[i][j]);
                        }
                        else { return false; }
                    }   
                }
                else if (j / 3 == 2) {
                    if (board[i][j] != '.') {
                        if (hashSet3.find(board[i][j]) == hashSet3.end()) {
                            hashSet3.insert(board[i][j]);
                        }
                        else { return false; }
                    }     
                }   
            }   

            if (i % 3 == 2) {
                hashSet1.clear();
                hashSet2.clear();
                hashSet3.clear();
            }
        }
        //恭喜你,经过了重重考验
        return true;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值