题目
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
上图是一个部分填充的有效的数独。
数独部分空格内已填入了数字,空白格用 '.' 表示。
解题思路:
最开始的思路是,遍历三次, 分别检测,行,列, 以及九个格子的数字是否有重复,
但是其实是可以简化成只遍历1次,
分别把三种情况的数字存储在对应的盒子中,
遍历一遍把对应的这个数字添加到对应的盒子中,同时做检测,当前数组是否存在。
public bool IsValidSudoku(char[][] board) {
Dictionary<string,List<char>> box = new Dictionary<string, List<char>>();
for (int i = 0; i < 9; i++)
{
List<char> tmp = new List<char>();
List<char> tmp1 = new List<char>();
for (int n = 0; n < 9; n++)
{
if (board[i][n] != '.')
{
if (!tmp.Contains(board[i][n]))
{
tmp.Add(board[i][n]);
}
else
{
return false;
}
string boxIndex = (i / 3).ToString() + (n / 3).ToString();
if (box.ContainsKey(boxIndex))
{
if (box[boxIndex].Contains(board[i][n]))
{
return false;
}
else
{
box[boxIndex].Add(board[i][n]);
}
}
else
{
List<char> array = new List<char>();
array.Add(board[i][n]);
box.Add(boxIndex,array);
}
}
if (board[n][i] != '.')
{
if (!tmp1.Contains(board[n][i]))
{
tmp1.Add(board[n][i]);
}
else
{
return false;
}
}
}
}
return true;
}
提交结果 :
内存消耗有点大, 还有好的办法吗?!
你们如果有好的思路欢迎讨论~~
一起刷题呀~~ 欢迎一起交流
QQ群 :665343902
以上都是都是引用的leetcode网站内容,若有侵权联系我~