LeetCode:36. Valid Sudoku(有效的数独)

题目

原题链接

算法

  • 这道题的要求是检验题目给出的九宫格是否有效,只需要检测给出的数字就可以了
  • 算法主要需要验证横向,纵向,子宫格是否有重复数字,可以分为三次遍历,也可以一次遍历
  • 可以利用公式 i n d e x = ( i / 3 ) ∗ 3 + j / 3 index=(i/3)*3+j/3 index=(i/3)3+j/3来表示每一个3x3子宫格的下标,(图是盗的)
    在这里插入图片描述
  • 这样检查横向的数字是否重复需要9个哈希表(或数组,因为这道题关键字是连续的数字),检查纵向需要9个哈希表(或数组),检查子宫格需要9个哈希表(或数组)
  • 对每一个出现的数字,找到其对应的子宫格,行,列分别对应的哈希表,对应的值加1,每次加一后检查如果哈希表对应的值大于一,则这个九宫格是无效的

AC代码(c++)

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        unordered_map<int,int> xbel[9];//横向9个哈希表
        unordered_map<int,int> ybel[9];//纵向9个哈希表
        unordered_map<int,int> boxes[9];//子宫格9个哈希表
        //两个for循环对九宫格棋盘进行一次遍历
        for(int i=0;i<9;i++)
            for(int j=0;j<9;j++)
            {
                char num=board[i][j];
                if(num!='.')
                {
                    int boxindex=(i/3)*3+j/3;
                    xbel[i][num]++;//对应的横向哈希表
                    ybel[j][num]++;//对应的纵向哈希表
                    boxes[boxindex][num]++;//对应的子宫格哈希表
                    if(xbel[i][num]>1||ybel[j][num]>1||boxes[boxindex][num]>1)//每一次添加后的检测
                        return false;
                }
            }
        return true;
    }
};

遇到问题

num!=’.‘和num!=".“的区别,如果按照第二个写,会报错
[Error] ISO C++ forbids comparison between pointer and integer [-fpermiss
原因:”."表示字符串的首地址,’.'表示字符
参考博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值