美文网首页
36. Valid Sudoku

36. Valid Sudoku

作者: codingXue | 来源:发表于2016-05-11 10:07 被阅读82次

问题描述

Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.
The Sudoku board could be partially filled, where empty cells are filled with the character '.'.

A partially filled sudoku which is valid.
Note: A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.

思路分析

这是一道Easy题,我一开始蠢了一下,想着用哈希表(Python里的dict)来提高速度,key值为'1', '2', ..., '9',当某数字在某行/列/方块中没有出现过时,value为False,出现时改为True,若读到某数时,发现其某行/列/方块记录中对应的value为True,则返回invalid。
这么做非常慢!Runtime: 384 ms, which beats 2.66% of Python submissions.
我用哈希表的初衷是这样对于一个数字可以在O(1)内寻址,然而经过男票教诲,发现明明搞个数组就可以在0(1)内寻址...
然后我就用数组的方式来记录数字的出现。申请三个9x9数组,分别记录行/列/方块中数字的出现情况。
然而这样还是挺慢的。Runtime: 104 ms, which beats 16.56% of Python submissions.
然后我去九章算法上看了参考程序,它采用的是每行/列/方块用一个set记录,读到一个数字后看相应set中是否已经存在该数字。
这种做法效率比较高。Runtime: 72 ms, which beats 89.37% of Python submissions.

得到的教训是:不要迷信和瞎用哈希表...

AC代码

class Solution(object):
    def isValidSudoku(self, board):
        """
        :type board: List[List[str]]
        :rtype: bool
        """
        line_set = [set([]) for j in range(9)]
        row_set = [set([]) for j in range(9)]
        square_set = [set([]) for j in range(9)]

        for i in range(9):
            for j in range(9):
                item = board[i][j]
                if item == '.':
                    continue
                if item in line_set[i] or item in row_set[j] or item in square_set[i/3 * 3 + j/3]:
                    return False
                else:
                    line_set[i].add(item)
                    row_set[j].add(item)
                    square_set[i/3 * 3 + j/3].add(item)
        return True

相关文章

  • hash_table-special

    目录: 36、 Valid Sudoku 36. Valid Sudoku Determine if a Sudo...

  • Leetcode-36 有效的数独

    36. 有效的数独[https://leetcode-cn.com/problems/valid-sudoku/]...

  • 36. Valid Sudoku

    这一题按照三步走的策略,首先检查每一行是否有重复的,再检查每一列,最后检查每一块,都是按照字典去查找,代码如下: ...

  • 36. Valid Sudoku

    Determine if a 9x9 Sudoku board is valid. Only the filled...

  • 36. Valid Sudoku

    题目 Determine if a Sudoku is valid, according to: Sudoku P...

  • 36. Valid Sudoku

    这题的解法是brute force,复杂度是O(81 + 81)。。。判断每一行每一列的代码我的想法跟code g...

  • 36. Valid Sudoku

    问题 Determine if a Sudoku is valid, according to: Sudoku P...

  • 36. Valid Sudoku

    Determine if a Sudoku is valid, according to: Sudoku Puzz...

  • 36. Valid Sudoku

    问题描述 Determine if a Sudoku is valid, according to: Sudoku...

  • 36. Valid Sudoku

    题目链接 https://leetcode.com/problems/valid-sudoku/ 解题思路 直接看...

网友评论

      本文标题:36. Valid Sudoku

      本文链接:https://www.haomeiwen.com/subject/jazyrttx.html