LeetCode 36——有效的数独
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——有效的数独的更多相关文章
- 前端与算法 leetcode 36. 有效的数独
目录 # 前端与算法 leetcode 36. 有效的数独 题目描述 概要 提示 解析 算法 传入[['5', '3', '.', '.', '7', '.', '.', '.', '.'],['6' ...
- Java实现 LeetCode 36 有效的数独
36. 有效的数独 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在 ...
- leetcode 36 有效的数独 哈希表 unordered_set unordersd_map 保存状态 leetcode 37 解数独
leetcode 36 感觉就是遍历. 保存好状态,就是各行各列还有各分区divide的情况 用数组做. 空间小时间大 class Solution { public: bool isValidSud ...
- [leetcode] 36. 有效的数独(Java)
没啥好说的,直接上就行 36. 有效的数独 class Solution { public boolean isValidSudoku(char[][] board) { Map<Charact ...
- LeetCode 36. 有效的数独(Valid Sudoku)
题目描述 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗 ...
- leetcode 36有效的数独
建立一个哈希表,每次查找,如果对应的列col,行row,小方格box中的数出现第二次,那么数独不合法: 据说还有深度优先搜索的方法,表示没有听懂:) class Solution { public: ...
- LeetCode:36. Valid Sudoku,数独是否有效
LeetCode:36. Valid Sudoku,数独是否有效 : 题目: LeetCode:36. Valid Sudoku 描述: Determine if a Sudoku is valid, ...
- 【Leetcode】【中等】【36. 有效的数独】【JavaScript】
题目描述 36. 有效的数独 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次.数字 1-9 在每一列只能出现一次.数字 1- ...
- [LeetCode] 36. Valid Sudoku 验证数独
Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to th ...
随机推荐
- python 通过 socket 发送文件
目录结构: client: #!/usr/bin/env python # -*-coding:utf-8 -*- import socket, struct, json download_dir = ...
- EntityFramework Code-First-------领域类配置之DataAnnotations
EF Code-First提供了一个可以用在领域类或其属性上的DataAnnotation特性集合,DataAnnotation特性会覆盖默认的EF约定. DataAnnotation存在于两个命名空 ...
- Struts2 第六讲 -- Struts2的结果类型
7.struts2的结果类型 l 每个 action 方法都将返回一个 String 类型的值, Struts 将根据这个值来决定响应什么结果. l 每个 Action 声明都必须包含有数量足够多的 ...
- Xshell中使用FTP/SFTP工具下载文件
(1)sftp host_ip,输入用户名/密码 (2)通过cd命令找到远程服务器要拷贝的文件: 通过lcd命令指定本地保存地址. (3)通过get filename拷贝文件 (4)在本地查看,已经可 ...
- Oracle数据库 数据完整性和DML语句
数据完整性和DML语句 数据完整性 数据完整性(Data Integrity)是指数据的精确性(Accuracy) 和可靠性(Reliability).它是应防止数据库中存在不符合语义规定的数据和防止 ...
- 《计算机图形学3D》
<计算机图形学方法原理应用> Opengl语言 光线跟踪 贝塞尔曲线 射线追踪 色彩理论 纹理映射 逆向运动 MPI 仿射 绘制流水线 透视变换 bre ...
- C++创建一个名为Ellipse的椭圆类--练习
题目描述: /*设计名为Ellipse的椭圆类*/ /* 其属性为外接矩形的左上角与右下角两个点的坐标,并能计算出椭圆的面积,并测试该类. */ 代码如下: #include<iostream& ...
- ABAP术语-Document Number
Document Number 原文:http://www.cnblogs.com/qiangsheng/archive/2008/01/28/1055636.html Key which ident ...
- 在Pycharm中导入第三方模块库(诸如:matplotlib、numpy等)
在Pycharm中导入第三方模块库 一.打开pycharm: 二.点击菜单上的“file” -> “setting”: 三.步骤二完成后出现界面如下所示.选中你的项目(比如thisyan Pro ...
- 微信公众号--JS-SDK
JS-SDK 微信JS-SDK是微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以 ...