leetcode ----有效的数独(python)

判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

上图是一个部分填充的有效的数独。

数独部分空格内已填入了数字,空白格用 ‘.’ 表示。

说明:

  • 一个有效的数独(部分已被填充)不一定是可解的。
  • 只需要根据以上规则,验证已经填入的数字是否有效即可。
  • 给定数独序列只包含数字 1-9 和字符 ‘.’ 。
  • 给定数独永远是 9x9 形式的。

1、先来一个比较简单的写法,思路也比较简单:就是对每一行,每一列,每个宫格进行重复性的排查,但是时间复杂度比较大O[n^3]

    def isValidSudoku(self, board):
        """
        :type board: List[List[str]]
        :rtype: bool
        """
        for i in range(len(board)):
            for j in range(len(board)):
                if board[i][j] != '.':
                    #判断行重复性
                    for k in range(j+1,9):
                        print k,j
                        if board[i][j] == board[i][k]:
                            #print board[i][j],board[i][k]
                            return False


                    #判断列重复性
                    for h in range(i+1,9):
                        if board[i][j] == board[h][j]:
                            print 2
                            return False
                    a = board[i][j]
                    board[i][j] = '0'
                    for g in range(i/3*3,i/3*3+3):
                        for q in range(j/3*3,j/3*3+3):
                            if a == board[g][q]:
                                print 1
                                return False


        return True

2、采用了计数器,减少一定的时间复杂度,然后判断那个key的是大于1了,如果有就是False,否则就是True

def isValidSudoku1(self, board):
        for i in range(len(board)):
            row={}
            col= {}
            box = {}
            for j in range(len(board)):
                if board[i][j] != '.':
                    #行判断
                    if board[i][j] in row:
                        row[board[i][j]] +=1
                    else:
                        row[board[i][j]] = 1
                    
                    if row[board[i][j]] >1:
                        #print 'r',row[board[i][j]]
                        return False


                if board[j][i] != '.':
                    #列判断
                    if board[j][i] in col:
                        col[board[j][i]] +=1
                    else:
                        col[board[j][i]] = 1


                    if col[board[j][i]]>1:
                        #print 'c',col[board[j][i]]
                        return False
                #print i/3*3+j/3,i%3*3+j%3
                if board[i/3*3+j/3][i%3*3+j%3] != '.':
                    
                    if board[i/3*3+j/3][i%3*3+j%3] in box:
                        box[board[i/3*3+j/3][i%3*3+j%3]] += 1
                    else:
                        box[board[i/3*3+j/3][i%3*3+j%3]] = 1
                        
                    if box[board[i/3*3+j/3][i%3*3+j%3]] >1:
                        return False
        return True

应该还有更好的方法吧,但是我比较愚笨,没有想出来,如果有大佬知道的话,希望不吝赐教!

猜你喜欢

转载自blog.csdn.net/weixin_42226038/article/details/80376057