1. 题目

2. 解答

将数独中数字的 ASCII 码值转化到 0-8 之间作为散列值,建立一个散列表,然后分别逐行、逐列、逐宫(3*3小块)统计每个数字的出现次数,若出现次数大于 1,则数独无效。

class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) { int table[9] = {0};
int i = 0, j = 0;
int index = 0; // 逐行扫描,判断数字 1-9 在每一行是否只出现一次
for (i = 0; i < 9; i++)
{
for (int m = 0; m < 9; m++)
{
table[m] = 0;
}
for (j = 0; j < 9; j++)
{
if (board[i][j] != 46)
{
index = board[i][j] - 49; // 将数字的 ASCII 转化为 1-9
table[index]++;
if (table[index] > 1)
{
return false;
}
}
}
} // 逐列扫描,判断数字 1-9 在每一列是否只出现一次
for (i = 0; i < 9; i++)
{
for (int m = 0; m < 9; m++)
{
table[m] = 0;
}
for (j = 0; j < 9; j++)
{
if (board[j][i] != 46)
{
index = board[j][i] - 49;
table[index]++;
if (table[index] > 1)
{
return false;
}
}
}
} // 逐块扫描,判断数字 1-9 在每一块是否只出现一次
int row = 0;
int col = 0; for (int m = 0; m < 3; m++)
{
row = m * 3;
for (int n = 0; n < 3; n++)
{
col = n * 3;
for (int k = 0; k < 9; k++)
{
table[k] = 0;
}
for (i = row; i < row+3; i++)
{
for (j = col; j < col+3; j++)
{
if (board[i][j] != 46)
{
index = board[i][j] - 49;
table[index]++;
if (table[index] > 1)
{
return false;
}
}
}
}
}
} return true;
}
};

上面的方法需要对数独遍历三次,我们也可以做到在遍历一次的情况下判断数独是否有效。

针对每行、每列和每宫分别建立一个散列表,然后在遍历数独的时候,根据下标 \(i, j\) 的变化确定三个散列表的值,若其中一个值大于 1,则数独无效。

其中,通过下标 \(i, j\) 来获取如下宫的顺序可以通过 \(i / 3 * 3 + j / 3\) 来获取。

class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) { int table1[9][9] = {0}, table2[9][9] = {0}, table3[9][9] = {0};
int i = 0, j = 0;
int index = 0;
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
{
if (board[i][j] != 46)
{
index = board[i][j] - 49; // 将数字的 ASCII 转化为 0-8
table1[i][index]++; // 行散列表
if (table1[i][index] > 1)
{
return false;
}
// 列散列表
table2[j][index]++;
if (table2[j][index] > 1)
{
return false;
}
// 宫散列表
table3[i/3*3+j/3][index]++;
if (table3[i/3*3+j/3][index] > 1)
{
return false;
}
}
}
} return true;
}
};

获取更多精彩,请关注「seniusen」!

LeetCode 36——有效的数独的更多相关文章

  1. 前端与算法 leetcode 36. 有效的数独

    目录 # 前端与算法 leetcode 36. 有效的数独 题目描述 概要 提示 解析 算法 传入[['5', '3', '.', '.', '7', '.', '.', '.', '.'],['6' ...

  2. Java实现 LeetCode 36 有效的数独

    36. 有效的数独 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在 ...

  3. leetcode 36 有效的数独 哈希表 unordered_set unordersd_map 保存状态 leetcode 37 解数独

    leetcode 36 感觉就是遍历. 保存好状态,就是各行各列还有各分区divide的情况 用数组做. 空间小时间大 class Solution { public: bool isValidSud ...

  4. [leetcode] 36. 有效的数独(Java)

    没啥好说的,直接上就行 36. 有效的数独 class Solution { public boolean isValidSudoku(char[][] board) { Map<Charact ...

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

    题目描述 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗 ...

  6. leetcode 36有效的数独

    建立一个哈希表,每次查找,如果对应的列col,行row,小方格box中的数出现第二次,那么数独不合法: 据说还有深度优先搜索的方法,表示没有听懂:) class Solution { public: ...

  7. LeetCode:36. Valid Sudoku,数独是否有效

    LeetCode:36. Valid Sudoku,数独是否有效 : 题目: LeetCode:36. Valid Sudoku 描述: Determine if a Sudoku is valid, ...

  8. 【Leetcode】【中等】【36. 有效的数独】【JavaScript】

    题目描述 36. 有效的数独 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次.数字 1-9 在每一列只能出现一次.数字 1- ...

  9. [LeetCode] 36. Valid Sudoku 验证数独

    Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to th ...

随机推荐

  1. JavaScript js调用堆栈(三)

    本文主要深入介绍JavaScript内存机制 内存模型 JS内存空间分为栈(stack),堆(heap),池(一般也会归类为栈中),其中栈存放变量,堆存放复杂对象,池存放常量. 注:闭包中的变量并不保 ...

  2. c# 任务超时执行组件

    最近整理下各类框架,学习一下欠缺的东西.因为前一年开发过java服务端,知道java有很多开源框架,但是毕竟起来也很累. 现在转回头从新审视c#,很基础,没有开源框架,因为以前它不开源,所以少,不用比 ...

  3. 爬虫——使用BeautifulSoup4的爬虫

    我们以腾讯社招页面来做示例:http://hr.tencent.com/position.php?&start=0#a 如上图,使用BeautifulSoup4解析器,将图1中229页,每页1 ...

  4. PHP+Mysql注入防护与绕过

    今天给大家分享一个关于php常见的注入防护以及如何bypass的文章,文章内容来源国外某大佬总结,我做了一下整理,文章来源地址不详,下面正文开始.以下的方式也仅仅是针对黑名单的过滤有一定的效果,为了安 ...

  5. 使用Win32DiskImager后重置SD卡

    再1.Windows diskpart命令 diskpart 2.列出所有的磁盘 lisk disk 3.选择U盘所在的磁盘 4.清除磁盘 clean 5.创建主分区 create primary p ...

  6. 如何理解NaN?

    NaN这个特殊的Number与所有其他值都不相等,包括它自己:   NaN===NaN:  //false   唯一能判断NaN的方法是通过isNaN()函数:   isNaN(NaN);  //tr ...

  7. 点按钮ajax get方法修改0或1状态封装成函数

    最终效果 列表页面表格里点击按钮修改状态 按钮样式要引入bootstrap才可以用 本文件用的是laravel框架环境 larave路由里 Route::get('category/changesta ...

  8. hive 从Excel中导入数据

    拿到Excel表后将数据保留,其他的乱七八糟都删掉,然后另存为txt格式的文本,用nodepad++将文本转换为UTF-8编码,此处命名为cityprovince.txt 将cityprovince. ...

  9. stm32f103 time2配置,转载

    //----------------------------main()-------------------- //stm32f103c8t6有3个普通1个高级定时器 //每次进入中断服务程序间隔时 ...

  10. HDU 5530:Pipes Selection

    题意: 给定长度为\(L\),元素总和为\(S\)的非负整数序列\(A\),对于每一个\(1 \leq i \leq S\),求出:所有满足\(\sum_{j=l}^rA_j=i\)的二元组\((l, ...