力扣 - 有效的数独

题目

 判断一个 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网站内容,若有侵权联系我~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值